→ dannypsnl: 我猜啦,同一行決議順序沒有規定 09/25 19:16
推 LPH66: 一樓正解, 不過這在 C++17 將會改變, 會是預期的 2 了 09/25 19:18
→ LPH66: 問題是在 << 運算子的左右兩邊沒說誰先做 09/25 19:19
→ 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