C 語言中 i++(後綴遞增)與 ++i(前綴遞增)的區別是經典必考點,也是極易在壓力下腦筋短路的細節。本文從語義、匯編、典型陷阱三個維度徹底講透,並附贈高壓環境下的心理調適小技巧。
| 運算符 | 表達式值 | 副作用(i 變化時機) |
|---|---|---|
++i | 遞增後的值 | 立即遞增 |
i++ | 遞增前的值 | 序列點前遞增(通常指語句結束前) |
int a = 0, b = 0;
printf("初始: a=%d, b=%d\n", a, b); // 0, 0
a = b++;
printf("a=b++: a=%d, b=%d\n", a, b); // 0, 1
a = ++b;
printf("a=++b: a=%d, b=%d\n", a, b); // 2, 2
; a = b++ mov eax, DWORD PTR [rbp-4] ; eax = b (0) mov DWORD PTR [rbp-8], eax ; a = eax (0) add DWORD PTR [rbp-4], 1 ; b = b + 1 (1) ; a = ++b add DWORD PTR [rbp-4], 1 ; b = b + 1 (2) mov eax, DWORD PTR [rbp-4] ; eax = b (2) mov DWORD PTR [rbp-8], eax ; a = eax (2)
關鍵觀察:b++ 先讀後寫,++b 先寫後讀。單獨語句 i++; 與 ++i; 效果完全一致,編譯器優化後生成相同機器碼。
func(i++) 傳遞舊值,func(++i) 傳遞新值。a = i++ + i++ 未定義行為(UB),C 標準不規定求值順序與副作用順序。while (i++ < 10) vs while (++i < 10) 邊界差 1。*p++ 等價 *(p++),先取值後移動指針;(*p)++ 先取值後增加指向的值。++i 符號在前,自己先升級,表達式用新值;i++ 符號在後,留舊值給別人用,自己默默升級。技術細節靠理解與練習固化,心理素質靠科學方法訓練。雙管齊下,關鍵時刻才能穩定輸出。