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

C語言迴圈結構精解:while、do-while、for 與 break/continue 控制流實戰

     編輯:關於C語言

C語言迴圈結構精解

迴圈是程式設計中實現重複邏輯的核心結構。C 語言提供 while、do-while、for 三種迴圈語句,配合 break 與 continue 可精準控制執行流程。本文深入剖析三種迴圈的語法、執行機制、適用場景與巢狀應用,並透過實戰範例展示 break/continue 的行為差異。

一、三大迴圈語法與執行流程

1.1 while 迴圈:先判斷後執行

while (條件運算式) {
    迴圈主體語句;
}
  • 特點:屬「當型迴圈」,條件為真(非 0)才進入主體;若初始條件即為假,主體一次也不執行。
  • 適用場景:迴圈次數未知,依動態條件決定(如讀取檔案至 EOF、等待使用者輸入合法值)。
// 範例:計算 1+2+...+n
int n, sum = 0, i = 1;
printf("請輸入 n:");
scanf("%d", &n);
while (i <= n) {
    sum += i;
    i++;
}
printf("總和 = %d\n", sum);

1.2 do-while 迴圈:先執行後判斷

do {
    迴圈主體語句;
} while (條件運算式); // 注意結尾分號
  • 特點:屬「直到型迴圈」,無條件執行至少一次,隨後依條件決定是否繼續。
  • 適用場景:選單系統、輸入驗證(至少提示一次)、至少需執行一次的初始化流程。
// 範例:選單至少顯示一次
int choice;
do {
    printf("1. 新增 2. 查詢 3. 退出\n選擇:");
    scanf("%d", &choice);
    // 處理選項...
} while (choice != 3);

1.3 for 迴圈:初始化、條件、迭代一體化

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

三、break 與 continue:流程控制利器

3.1 break:立即跳出「當前」迴圈

  • 僅影響最內層包含它的 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);
}

3.2 continue:跳過「本次」迭代,直接進入下一次判斷

  • 僅用於迴圈(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);
}

3.3 break vs continue 行為對比

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 僅作用於最內層迴圈。若需跳出多層,常見策略:

  1. 旗標變數:外層檢查旗標決定是否 break。
  2. 函數封裝:將巢狀迴圈放入函數,用 return 直接返回。
  3. goto 標籤:極少數情況下可用,但需謹慎,避免製造義麵程式碼。
// 策略 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

六、總結

  • while:未知次數、先判斷。
  • do-while:至少一次、後判斷。
  • for:已知次數、計數器管理集中。
  • break:跳出整個迴圈。
  • continue:跳過本輪,進入下輪。

熟練掌握三種迴圈的轉換與 break/continue 的精準控制,能寫出邏輯清晰、效率優異的 C 程式。建議實作「質數篩選」、「矩陣轉置」、「猜數字遊戲」等經典練習,將知識內化為肌肉記憶。

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