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

看板C_and_CPP作者 (紅蓮西風750)時間8年前 (2017/09/25 18:48), 編輯推噓5(5013)
留言18則, 5人參與, 最新討論串1/1
開發平台(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

09/25 19:16, , 1F
我猜啦,同一行決議順序沒有規定
09/25 19:16, 1F

09/25 19:18, , 3F
一樓正解, 不過這在 C++17 將會改變, 會是預期的 2 了
09/25 19:18, 3F

09/25 19:19, , 4F
問題是在 << 運算子的左右兩邊沒說誰先做
09/25 19:19, 4F

09/25 19:23, , 5F

09/25 22:21, , 6F
如果你知道編譯器會將 cout << a << b << c << endl; 擴張
09/25 22:21, 6F

09/25 22:21, , 7F
為一連串函數呼叫,就會明白原因
09/25 22:21, 7F

09/25 22:25, , 8F
將你的cout 簡化成 cout << addOne(i) << i; 的話,大概會
09/25 22:25, 8F

09/25 22:26, , 9F
被編譯成 <<( <<(cout, addOne(i)) , i);
09/25 22:26, 9F

09/25 22:29, , 10F
可見i初次被使用時,值未被addOne()變更
09/25 22:29, 10F

09/25 22:31, , 11F
這裏還牽涉函數堆疊、以值/位址傳入的概念,嘩,C++很深奧
09/25 22:31, 11F

09/25 23:47, , 12F
其實這裡有點微妙, pre-C++17 的話這是對的
09/25 23:47, 12F

09/25 23:47, , 13F
但 C++17 新增的規定有特別把 << >> 兩個運算子拉出來
09/25 23:47, 13F

09/25 23:47, , 14F
規定其運算元的執行順序, 所以不能單單展成函數呼叫
09/25 23:47, 14F

09/25 23:48, , 15F
(即使在新規定之下普通函數呼叫其參數執行順序依然未指定)
09/25 23:48, 15F

09/26 06:18, , 16F
c++17自己overload有辦法寫出滿足規定的實作嗎
09/26 06:18, 16F

09/26 08:44, , 17F
唔嗯, 這跟你的實作相對無關, 而是在進你的函數之前
09/26 08:44, 17F

09/26 08:45, , 18F
計算參數的順序問題; pre-C++17 沒規定, C++17 定先左再右
09/26 08:45, 18F
文章代碼(AID): #1PoDxbRc (C_and_CPP)