首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

深入理解 C 語言自增運算符:多個 ++ 的陷阱與求值順序

     編輯:關於C

經典題目:x 與 y 的值是多少?

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 中。以逆波蘭表達式(後綴表示法)的堆疊求值模型思考最清晰:

  1. 先算 (++i) + (++i) → i 先遞增兩次變為 5,ans = 5 + 5 = 10。
  2. 再算 ans + (++i) → i 遞增為 6,ans = 10 + 6 = 16。
  3. 再算 ans + (++i) → i 遞增為 7,ans = 16 + 7 = 23。
  4. 最後賦值 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。

總結與建議

  • 單一運算式中避免對同一變數多次修改(C 標準未定義行為風險)。
  • 若必須連續遞增,請拆分為多條語句,明確順序。
  • 理解序列點與副作用完成時機,是寫出正確、可移植 C 程式的關鍵。

「過早優化是萬惡之源」,清晰的程式碼永遠優於花巧的技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved