首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言經典陷阱:do-while 中後置遞減導致的無限循環深度解析

     編輯:程式設計綜合問答

問題代碼

int a = 10;
do {
    a--;
} while (a--);

為什麼是無限循環?

關鍵在於 `while(a--)` 的求值順序:

  1. 循環體執行 a--,a 變 9。
  2. 進入 `while` 判斷:先使用當前值 9 進行真假判斷(非 0 為真),然後再將 a 遞減為 8。
  3. 循環體再執行 a--,a 變 7。
  4. 下一次 `while` 判斷用 7,遞減為 6……
  5. 當 a 從 1 變 0 時:循環體執行後 a=-1;`while` 判斷用 -1(真),遞減為 -2。
  6. a 持續變為負數,永遠不為 0,條件永真 → 無限循環。

內存演示表

輪次循環體 a-- 後while 判斷值while 遞減後
199 (真)8
277 (真)6
............
10-1-1 (真)-2
∞負無窮永真負無窮

修正寫法

// 方案 1:預先遞減
int a = 10;
do {
    a--;
} while (--a);   // 先遞減再判斷,a 變 0 時退出

// 方案 2:分離判斷與修改
int a = 10;
while (a > 0) {
    a--;
}

核心口訣

後置 `++/--`:先用後改。前置 `++/--`:先改後用。
在條件判斷中,永優先使用前置形式或顯式比較,避免副作用導致邏輯難以預測。

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