C 語言提供四種跳轉語句:goto、break、continue、return。本文聚焦前三者,通過經典示例剖析語義、陷阱與現代編程規範下的使用建議。
goto label;
...
label: statement;
label 為標識符,函數內唯一,後接冒號。goto 無條件跳轉到標號處繼續執行。
int n = 0;
printf("input a string\n");
loop: if (getchar() != '\n') { n++; goto loop; }
printf("%d", n);
利用 if + goto 構造循環,功能等價 while (getchar() != '\n') n++;。
goto cleanup; 集中釋放(Linux 內核風格)。break 僅能跳出單層,goto 可直接跳到外層標號。break; // 僅能出現在 for/while/do-while/switch 內部
立即跳出內層循環或 switch,繼續執行其後語句。
for (int n = 7; n <= 100; ++n) {
if (n % 7 != 0) continue; // 見下文
printf("%d ", n);
}
char a, b = getchar();
while ((a = getchar()) != '\n') {
if (a == b) { printf("same\n"); break; }
b = a;
}
continue; // 僅能出現在循環體內
結束本次迭代,直接跳到循環條件判斷(for 的第三表達式、while/do-while 的條件),不跳出循環。
for (int n = 7; n <= 100; ++n) {
if (n % 7 != 0) continue; // 非倍數直接進入下一輪
printf("%d ", n); // 只有倍數能執行到這裡
}
for (int n = 2; n <= 100; ++n) {
int limit = (int)sqrt(n);
for (int i = 2; i <= limit; ++i)
if (n % i == 0) goto not_prime; // 或用 break + 標誌變量
printf("%d ", n);
not_prime: ;
}
| 語句 | 作用範圍 | 跳轉目標 | 典型用途 | 風險 |
|---|---|---|---|---|
| goto | 函數內任意處 | 標號 | 錯誤清理、多層跳出 | 濫用導致不可維護 |
| break | 循環/switch 內部 | 緊隨該結構之後 | 提前結束搜尋、狀態機 | 易誤跳出外層循環 |
| continue | 循環體內部 | 循環條件判斷處 | 過濾不符合條件的迭代 | for 循環中跳過增量表達式 |
if/else、while/for、函數提取、標誌變量,消除 90% 的 goto 需求。goto 模擬,是公認最清晰的資源管理模式。bool done = false 標誌或提取函數 return。loop: ... goto loop; 純粹是 while(1) 的反模式。goto、break、continue 是 C 語言賦予程序員的「尖銳工具」。break/continue 是循環的標準控制流擴展,應善用;goto 是雙刃劍,僅在資源清理、多層跳出等明確受益場景謹慎使用,並加註釋說明意圖。 代碼的可讀性、可維護性永遠優先於炫技。