看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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 <-----覺得它應該印2,但是卻印1 lastest line: 2 餵入的資料(Input):預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) http://cpp.sh/9qx6s 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.239.248.77 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1506336485.A.6E6.html
dannypsnl: 我猜啦,同一行決議順序沒有規定 09/25 19:16
LPH66: 一樓正解, 不過這在 C++17 將會改變, 會是預期的 2 了 09/25 19:18
LPH66: 問題是在 << 運算子的左右兩邊沒說誰先做 09/25 19:19
LPH66: https://wandbox.org/permlink/2cRJkP2imKVDTSys C++17 09/25 19:23
jimfan: 如果你知道編譯器會將 cout << a << b << c << endl; 擴張 09/25 22:21
jimfan: 為一連串函數呼叫,就會明白原因 09/25 22:21
jimfan: 將你的cout 簡化成 cout << addOne(i) << i; 的話,大概會 09/25 22:25
jimfan: 被編譯成 <<( <<(cout, addOne(i)) , i); 09/25 22:26
jimfan: 可見i初次被使用時,值未被addOne()變更 09/25 22:29
jimfan: 這裏還牽涉函數堆疊、以值/位址傳入的概念,嘩,C++很深奧 09/25 22:31
LPH66: 其實這裡有點微妙, pre-C++17 的話這是對的 09/25 23:47
LPH66: 但 C++17 新增的規定有特別把 << >> 兩個運算子拉出來 09/25 23:47
LPH66: 規定其運算元的執行順序, 所以不能單單展成函數呼叫 09/25 23:47
LPH66: (即使在新規定之下普通函數呼叫其參數執行順序依然未指定) 09/25 23:48
lovejomi: c++17自己overload有辦法寫出滿足規定的實作嗎 09/26 06:18
LPH66: 唔嗯, 這跟你的實作相對無關, 而是在進你的函數之前 09/26 08:44
LPH66: 計算參數的順序問題; pre-C++17 沒規定, C++17 定先左再右 09/26 08:45