int n = 0;
while (n++ < 10)
printf("%5d", n);
初學者直覺輸出:`0 1 2 ... 10`(以為先比較再打印再自增)。
實際輸出:`1 2 3 ... 10`。
根據 C 標準(C99/C11),**完整表達式的結束是一個順序點**。`while` 的判斷條件 `n++ < 10` 是一個完整表達式。
因此執行流為:
// 迭代 1
n 舊值 0 < 10 → true
n 變為 1 (副作用完成)
printf 打印 n (現在是 1)
// 迭代 2
n 舊值 1 < 10 → true
n 變為 2
printf 打印 2
...
// 迭代 10
n 舊值 9 < 10 → true
n 變為 10
printf 打印 10
// 迭代 11
n 舊值 10 < 10 → false
循環結束,n 為 11 (但不再打印)
while (++n < 10) printf("%d", n); // 輸出 1 2 ... 9 (n 先增後比較,打印新值)
理解順序點規則,是寫出無未定義行為 C 代碼的基石。