++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; // 未定義行為
編譯器可能產生不同結果,甚至導致程式崩潰。
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.
i++;
a = i + 1;-Wall -Wextra -Wsequence-point),GCC/Clang 可偵測大多數此類問題。func(i++, i); // 錯誤前綴 ++i:先加後用,值為新值。
後綴 i++:先用後加,值為舊值。
單獨一行無分別,同式多改莫嘗試。