while 循環:先判斷後執行
int i = 0;
while (i < 10) {
i++;
printf("%d\n", i);
}
// 輸出 1~10
- 條件為真(非零)執行循環體。
- 可能零次執行:若初始條件為假,循環體不執行。
do-while 循環:先執行後判斷
int i = 0;
do {
i++;
printf("%d\n", i);
} while (i < 10);
// 輸出 1~10
- 無條件執行一次循環體,再判斷條件。
- 至少執行一次:即使條件初始為假。
核心差異對比
int i = 10;
while (i < 10) { printf("while"); } // 不執行
do { printf("do while"); } while (i < 10); // 執行一次
| 特性 | while | do-while |
| 判斷時機 | 循環開始前 | 循環結束後 |
| 最少執行次數 | 0 | 1 |
| 適用場景 | 需先檢查條件 | 至少需執行一次(如菜單輸入) |
| 條件語法 | while(expr) | do stmt while(expr); (注意分號) |
break 與 continue 控制流
int i = 0;
while (i < 10) {
i++;
if (i == 8) break; // 直接跳出整個循環
if (i % 2 == 0) continue; // 跳過本次剩餘,進入下一次判斷
printf("%d\n", i); // 僅輸出奇數 1,3,5,7
}
break:跳出當前層循環或 switch。
continue:跳過本次循環體剩餘部分,直接進行下一次條件判斷(for 則執行遞增表達式)。
無限循環模式
while(1) / while(!0)
int i = 0;
while (1) {
i++;
printf("%d\n", i);
if (i == 100) break;
}
- 條件恆為真,必須在循環體內用
break、return、exit 跳出。
- 適用於事件循環、服務器主循環、菜單系統。
for(;;) 等價寫法
for (;;) { /* ... */ } // 三表達式全省略,同 while(1)
常見陷阱與避坑
- 分號陷阱:
while (i < 10); 空循環體 → 死循環(若 i 不變)。
- do-while 必須以分號結尾:
} while (cond); 缺分號為語法錯誤。
- continue 在 while 中不執行遞增:若遞增在
continue 之後,會導致死循環。
while (i < 10) {
if (i == 5) continue;
i++; // i==5 時不執行 → 死循環
}
解決:遞增前置或用 for 循環。
- 浮點數作為循環條件:精度問題導致次數不準,避免使用。
while vs for 選擇指南
| 場景 | 推薦 | 理由 |
| 已知循環次數/計數器 | for | 初始化/條件/遞增集中,不易漏寫 |
| 條件複雜/非計數 | while | 語義清晰:當條件滿足時持續 |
| 至少一次執行 | do-while | 語法保證首次執行 |
| 事件驅動/無限循環 | while(1) / for(;;) | 慣用模式,意圖明確 |
總結
while(先判後執,可零次)、do-while(先執後判,至少一次)、for(計數循環首選)構成 C 循環三大支柱。掌握 break/continue 語義差異、無限循環模式與常見陷阱(分號、continue 位置、浮點條件),能寫出正確、高效、可讀的循環代碼。