迴圈是程式設計中實現重複邏輯的核心結構。C 語言提供 while、do-while、for 三種迴圈語句,配合 break 與 continue 可精準控制執行流程。本文深入剖析三種迴圈的語法、執行機制、適用場景與巢狀應用,並透過實戰範例展示 break/continue 的行為差異。
while (條件運算式) {
迴圈主體語句;
}
// 範例:計算 1+2+...+n
int n, sum = 0, i = 1;
printf("請輸入 n:");
scanf("%d", &n);
while (i <= n) {
sum += i;
i++;
}
printf("總和 = %d\n", sum);
do {
迴圈主體語句;
} while (條件運算式); // 注意結尾分號
// 範例:選單至少顯示一次
int choice;
do {
printf("1. 新增 2. 查詢 3. 退出\n選擇:");
scanf("%d", &choice);
// 處理選項...
} while (choice != 3);
for (初始化運算式; 條件運算式; 迭代運算式) {
迴圈主體語句;
}
for(;;) 為無限迴圈。// 範例:九九乘法表(巢狀 for)
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%dx%d=%2d ", j, i, i*j);
}
putchar('\n');
}
| 寫法 | 說明 | 範例 |
|---|---|---|
| 省略初始化 | 計數器在迴圈外宣告初始化 | int i=0; for(; i<5; i++)... |
| 省略條件 | 需在主體內用 break 跳出 | for(;;){ if(i>=5) break; ... } |
| 省略迭代 | 在主體內手動更新計數器 | for(; i<5;){ ... i++; } |
| 多重初始化/迭代 | 用逗號運算子分隔 | for(i=0,j=10; i |
while/do-while/for/switch。if-else 結構。// 範例:計算圓面積,超過 100 即停止
for (int r = 1; r <= 10; r++) {
double area = 3.14 * r * r;
if (area > 100) break; // 跳出 for 迴圈
printf("r=%d, area=%.2f\n", r, area);
}
for/while/do-while)。for 迴圈中,continue 後會執行「迭代運算式」再判斷條件;while/do-while 則直接重新判斷條件。// 範例:輸出 100-200 間不被 3 整除的數
for (int i = 100; i <= 200; i++) {
if (i % 3 == 0) continue; // 跳過本次 printf
printf("%d ", i);
}
for (int i = 1; i <= 5; i++) {
if (i == 3) break;
printf("break: %d\n", i);
}
// 輸出:1 2 (i=3 時 break,迴圈結束)
for (int i = 1; i <= 5; i++) {
if (i == 3) continue;
printf("continue: %d\n", i);
}
// 輸出:1 2 4 5 (i=3 時 continue,跳過列印,繼續 i=4,5)
break/continue 僅作用於最內層迴圈。若需跳出多層,常見策略:
break。return 直接返回。// 策略 1:旗標
int stop = 0;
for (int i = 0; i < 10 && !stop; i++) {
for (int j = 0; j < 10; j++) {
if (i * j > 50) { stop = 1; break; }
}
}
// 策略 2:函數封裝(推薦)
void search(void) {
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
if (i * j > 50) return; // 直接跳出所有層
}
| 陷阱 | 後果 | 修正 |
|---|---|---|
while (x = 5) 用賦值而非比較 | 永真迴圈,x 被設為 5 | 改為 while (x == 5);開啟編譯器警告 -Wall |
for (int i=0; i<=n; i++) 邊界多跑一次 | 陣列越界、邏輯錯誤 | 嚴格區分 < 與 <=,C 慣用 i < n |
在 while/do-while 中 continue 前忘記更新計數器 | 無限迴圈 | 確保 continue 前已更新條件變數,或改用 for |
巢狀迴圈變數名稱重複(皆用 i) | 內層覆蓋外層計數器 | 使用 i, j, k 或語意化名稱 row, col |
熟練掌握三種迴圈的轉換與 break/continue 的精準控制,能寫出邏輯清晰、效率優異的 C 程式。建議實作「質數篩選」、「矩陣轉置」、「猜數字遊戲」等經典練習,將知識內化為肌肉記憶。