[問題] 這時的cout<<裡,為什麼還可以印出1??

作者: Zephyr750 (紅蓮西風750)   2017-09-25 18:48:00
開發平台(Platform): (Ex: Win10, Linux, ...)
windows
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
visual studio 2008
win32 console
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
none
問題(Question):
add one: 2
add one return : 2
i: 1 <
作者: dannypsnl (秦書)   2017-09-25 19:16:00
我猜啦,同一行決議順序沒有規定
作者: KKeiko   2017-09-25 19:17:00
作者: LPH66 (-6.2598534e+18f)   2017-09-25 19:18:00
一樓正解, 不過這在 C++17 將會改變, 會是預期的 2 了問題是在 << 運算子的左右兩邊沒說誰先做https://wandbox.org/permlink/2cRJkP2imKVDTSys C++17
作者: jimfan (jimfan)   2017-09-25 22:21:00
如果你知道編譯器會將 cout << a << b << c << endl; 擴張為一連串函數呼叫,就會明白原因將你的cout 簡化成 cout << addOne(i) << i; 的話,大概會被編譯成 <<( <<(cout, addOne(i)) , i);可見i初次被使用時,值未被addOne()變更這裏還牽涉函數堆疊、以值/位址傳入的概念,嘩,C++很深奧
作者: LPH66 (-6.2598534e+18f)   2017-09-25 23:47:00
其實這裡有點微妙, pre-C++17 的話這是對的但 C++17 新增的規定有特別把 << >> 兩個運算子拉出來規定其運算元的執行順序, 所以不能單單展成函數呼叫(即使在新規定之下普通函數呼叫其參數執行順序依然未指定)
作者: lovejomi (JOMI)   2017-09-26 06:18:00
c++17自己overload有辦法寫出滿足規定的實作嗎
作者: LPH66 (-6.2598534e+18f)   2017-09-26 08:44:00
唔嗯, 這跟你的實作相對無關, 而是在進你的函數之前計算參數的順序問題; pre-C++17 沒規定, C++17 定先左再右

Links booklink

Contact Us: admin [ a t ] ucptt.com