C 語言提供 break、continue、goto 三種跳轉語句。前二者是結構化迴圈/開關的標準控制流,goto 則是無條件跳轉,濫用會導致「義大利麵代碼」。本文詳細解析各語句語義、適用場景與禁忌。
break:跳出當層迴圈或 switchswitch 中
switch (ch) {
case 'a': doA(); break; // 必須 break,否則貫穿執行下一 case
case 'b': doB(); break;
default: doDefault();
}
無 break 會導致「貫穿」,這雖可用於合併 case,但極易誤用。
while (1) {
char c = getch();
if (c == 27) break; // ESC 鍵跳出無限迴圈
process(c);
}
通常與 if 結合:滿足條件時提前終止迴圈。
if-else 無效:break 只能跳出 switch、for、while、do-while
for (int i=0; i<3; ++i)
for (int j=0; j<3; ++j)
if (cond) break; // 只跳出內層 j 迴圈
goto、標誌變數或重構為函數 returncontinue:跳過本次迭代,直接進入下一次判斷
for (int i = 1; i <= 10; ++i) {
if (i % 2 == 0) continue; // 跳過偶數
printf("%d ", i); // 只列印奇數
}
| 迴圈類型 | continue 後執行流程 |
|---|---|
while / do-while | 直接跳到條件判斷 |
for | 執行增量運算式,再判斷條件 |
goto:無條件跳轉(請極度謹慎使用)
goto label;
...
label: statement;
for (int i=0; i
int foo() {
if (init1() != 0) goto err1;
if (init2() != 0) goto err2;
if (init3() != 0) goto err3;
return 0;
err3: cleanup2();
err2: cleanup1();
err1: return -1;
}
for/while)if/switch/迴圈)
#include
#include
int main(void) {
int count = 0;
while (1) {
char c = '\0';
// 內層:讀取一行直到 Enter 或 ESC
while (c != '\r' && c != 27) {
c = getch();
putchar(c);
}
if (c == 27) break; // ESC 跳出外層迴圈
++count;
printf("\nLine %d processed\n", count);
}
puts("Program ended.");
return 0;
}
| 語句 | 推薦程度 | 核心原則 |
|---|---|---|
break | ✅ 推薦 | 只在 switch、迴圈中使用;多層跳出改用函數 return 或標誌變數 |
continue | ✅ 推薦 | 用於「衛語句」過濾不需處理的迭代,保持主流程縮排淺層 |
goto | 🚫 極度謹慎 | 僅用於多層跳出、錯誤處理集中化;嚴禁構建迴圈、跳入區塊 |
break 與 continue 是迴圈控制的標準工具,善用它們能讓迴圈邏輯清晰、縮排淺層。goto 是「核武器」——有極少數正當用途(錯誤清理、多層跳出),但 99% 情況下應由結構化控制流取代。紀律:寫 goto 前先思考能否用函數 return 或布林旗標解決。