作者Zephyr750 (紅蓮西風750)
看板C_and_CPP
標題[問題] 這時的cout<<裡,為什麼還可以印出1??
時間Mon Sep 25 18:48:00 2017
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1506336485.A.6E6.html
1F:→ dannypsnl: 我猜啦,同一行決議順序沒有規定 09/25 19:16
3F:推 LPH66: 一樓正解, 不過這在 C++17 將會改變, 會是預期的 2 了 09/25 19:18
4F:→ LPH66: 問題是在 << 運算子的左右兩邊沒說誰先做 09/25 19:19
6F:→ jimfan: 如果你知道編譯器會將 cout << a << b << c << endl; 擴張 09/25 22:21
7F:→ jimfan: 為一連串函數呼叫,就會明白原因 09/25 22:21
8F:→ jimfan: 將你的cout 簡化成 cout << addOne(i) << i; 的話,大概會 09/25 22:25
9F:→ jimfan: 被編譯成 <<( <<(cout, addOne(i)) , i); 09/25 22:26
10F:→ jimfan: 可見i初次被使用時,值未被addOne()變更 09/25 22:29
11F:→ jimfan: 這裏還牽涉函數堆疊、以值/位址傳入的概念,嘩,C++很深奧 09/25 22:31
12F:推 LPH66: 其實這裡有點微妙, pre-C++17 的話這是對的 09/25 23:47
13F:→ LPH66: 但 C++17 新增的規定有特別把 << >> 兩個運算子拉出來 09/25 23:47
14F:→ LPH66: 規定其運算元的執行順序, 所以不能單單展成函數呼叫 09/25 23:47
15F:→ LPH66: (即使在新規定之下普通函數呼叫其參數執行順序依然未指定) 09/25 23:48
16F:推 lovejomi: c++17自己overload有辦法寫出滿足規定的實作嗎 09/26 06:18
17F:→ LPH66: 唔嗯, 這跟你的實作相對無關, 而是在進你的函數之前 09/26 08:44
18F:→ LPH66: 計算參數的順序問題; pre-C++17 沒規定, C++17 定先左再右 09/26 08:45