n++ 在表達式中的行為:以 (y + n++)*6 為例初學者常誤以為 n++ 會馬上把 n 加 1 並參與當前運算。本文通過拆解編譯器生成的等效代碼,揭示「先用後加」的本質。
int y = 2;
int n = 3;
int nextnum = (y + n++) * 6;
printf("%d\n", nextnum); // 輸出 30,而非 36
錯誤推導:n++ → n=4 → (2+4)*6 = 36
真實語義:後置遞增的「值」是遞增前的值,「副作用」(修改變量)在序列點之後完成。
int nextnum = (y + n) * 6; // 1. 使用 n 的當前值 (3) 參與運算
n = n + 1; // 2. 隨後將 n 更新為 4
// nextnum = (2 + 3) * 6 = 30
後置遞增運算符
++的結果是運算元的值。運算元遞增的副作用在下一個序列點之前完成。
在完整表達式 (y + n++) * 6 結束處(分號)即為序列點,n 必須在該處已更新。
++nint nextnum = (y + ++n) * 6; // 等效於 n = n + 1; nextnum = (y + n) * 6;
// n 先變 4,再參與運算 → (2+4)*6 = 36
n++; 或 ++n; 效果相同,推薦 ++n(無臨時變量開銷)。a[i++] = b[j++] 這類代碼雖合法但降低可讀性,建議拆分。i = 1; i = i++ + ++i; 此類題目在 C/C++ 中屬於未定義行為(UB),因同一序列點多次修改同一變量,切勿模仿。n++ 返回舊值,隨後修改變量。理解「值」與「副作用」的時序分離,是寫出正確 C/C++ 代碼的關鍵。