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

C 語言 ++i 與 i++ 深度解析:副作用、序列點與未定義行為

     編輯:關於C

核心差異:值與副作用的時序

++i(前綴)與 i++(後綴)均會將 i 加 1,但表達式的值不同:

  • ++i:先遞增,表達式值為遞增後的值。
  • i++:表達式值為遞增前的值,遞增動作在稍後完成。

直觀範例

int i = 3, a;
a = i++ + 1;  // a = 3 + 1 = 4,i 變為 4
int j = 3, b;
b = ++j + 1;  // b = 4 + 1 = 5,j 變為 4

單獨語句下等價

若自增運算單獨成行(如 i++; 或 ++i;),兩者效果完全一致,均為 i = i + 1。

危險區:同一表達式多次修改同一變量

C 標準規定:在兩個序列點之間,對同一標量物件進行多次修改,或修改後又讀取其值以計算其他值,屬於未定義行為。

典型錯誤範例

int i = 1;
printf("%d %d", i++, i);      // 輸出順序不確定
int a = i + ++i;              // 未定義行為
a = i++ + ++i;                // 未定義行為

編譯器可能產生不同結果,甚至導致程式崩潰。

標準說明(C99/C11 6.5 條款)

Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.

最佳實踐建議

  1. 避免在同一表達式中對同一變量使用多次自增/自減。
  2. 若需連續操作,拆分為多條語句:
    i++;
    a = i + 1;
  3. 啟用編譯器警告(-Wall -Wextra -Wsequence-point),GCC/Clang 可偵測大多數此類問題。
  4. 函數引數求值順序未規定,切勿在引數中使用有副作用的運算:
    func(i++, i); // 錯誤

總結口訣

前綴 ++i:先加後用,值為新值。
後綴 i++:先用後加,值為舊值。
單獨一行無分別,同式多改莫嘗試。

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