經典 C 語言面試題:分析下列程式碼為何導致無限迴圈而非預期的 6 次執行。
int main() {
int i = 0;
while (i < 10) {
if (i < 1) continue;
if (i == 5) break;
i++;
}
return 0;
}
| 迴圈次數 | i 初值 | i < 1? | continue? | i == 5? | i++? | i 末值 |
|---|---|---|---|---|---|---|
| 1 | 0 | 真 | 是 → 跳過後續 | - | 否 | 0 |
| 2 | 0 | 真 | 是 → 跳過後續 | - | 否 | 0 |
| ... | 0 | 真 | 是 → 永遠跳過 | - | 否 | 0 |
if (i < 1) continue; 導致 i++ 永遠不執行,i 永遠保持 0,形成無限迴圈。
// 版本一:調整條件順序
int i = 0;
while (i < 10) {
if (i == 5) break;
i++;
if (i < 1) continue; // 這行其實多餘,i 從 0 開始遞增永不小於 1
}
// 版本二:預期邏輯 (執行 6 次: i=0,1,2,3,4,5 時 break)
int i = 0;
while (i < 10) {
if (i == 5) break;
printf("i = %d\n", i);
i++;
}
continue 會跳過本次迴圈剩餘所有語句,包含遞增操作continue 可能跳過的路徑之外printf 追蹤變數值這不是迴圈次數計算錯誤,而是控制流程邏輯錯誤導致無限迴圈。理解 continue 的跳過範圍,是避免此類 Bug 的關鍵。