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

C語言 while 循環條件中的後綴自增陷阱:順序點與副作用詳解

     編輯:關於C語言

現象:預期與現實的偏差

int n = 0;
while (n++ < 10)
    printf("%5d", n);

初學者直覺輸出:`0 1 2 ... 10`(以為先比較再打印再自增)。
實際輸出:`1 2 3 ... 10`。

核心解析:順序點與副作用

根據 C 標準(C99/C11),**完整表達式的結束是一個順序點**。`while` 的判斷條件 `n++ < 10` 是一個完整表達式。

  1. 副作用(自增):保證在進入循環體 `printf` **之前**完成。
  2. 值計算(比較):使用自增**前**的舊值(0)與 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(cond)` 中 `cond` 的副作用**必須**在循環體執行前完成。
  • 若需「先打印再自增」,請拆分:`while (n < 10) { printf(...); n++; }`。

延伸:前綴 `++n` 的行為

while (++n < 10) printf("%d", n); // 輸出 1 2 ... 9 (n 先增後比較,打印新值)

理解順序點規則,是寫出無未定義行為 C 代碼的基石。

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