int x, y, i = 3;
x = (i++) + (i++);
i = 3;
y = (++i) + (++i);
答案: x = 6(i 變為 5),y = 10(i 變為 5)。
x 容易理解:後置遞增先取值再加 1,兩個 i++ 分別取 3 和 3,相加得 6。但 y 為何是 5+5=10 而非 4+5=9?
i = 3;
y = (++i) + (++i) + (++i) + (++i);
直覺可能認為 i 依次變為 4、5、6、7,相加得 4+5+6+7=22 或全為 7 得 28。實際結果:y = 23,i = 7。
+ 是二元運算符,每次運算只需兩個操作數,結果暫存於中間變數 ans 中。以逆波蘭表達式(後綴表示法)的堆疊求值模型思考最清晰:
(++i) + (++i) → i 先遞增兩次變為 5,ans = 5 + 5 = 10。ans + (++i) → i 遞增為 6,ans = 10 + 6 = 16。ans + (++i) → i 遞增為 7,ans = 16 + 7 = 23。y = ans = 23。切勿誤以為四個 ++i 先全部執行完畢再兩兩相加。
i = 3;
y = (i++) + (i++) + (i++) + (i++);
若套用上述邏輯,可能推導出 ans=3+3=6; ans=6+5=11; ans=11+6=17; y=17。但實際執行發現 y = 12(3+3+3+3),i 最終為 7。
++i(前置):可視為 (i = i + 1),遇到即執行遞增,隨後參與後續運算。i++(後置):其遞增副作用延遲至整個運算式求值完成後(序列點之前)一次性執行。簡單說:先忽略所有 i++ 的遞增,按當前值計算運算式,結束後再對相關變數逐一遞增。因此四個 i++ 全取初值 3 相加得 12,運算式結束後 i 連續遞增四次變為 7。
「過早優化是萬惡之源」,清晰的程式碼永遠優於花巧的技巧。