goto 是 C 語言提供的無條件跳轉語句,雖然結構化程式設計理念極力反對使用,但在特定極端場景(如多層巢狀迴圈緊急跳出)仍有其生存空間。本文解析語法、風險與唯一建議用法。
goto label;
...
label: statement;
label 為標識符 + 冒號 :,作用域限定於同一函式內。if 使用:if (condition) goto label;#include <stdio.h>
int main(void) {
int i = 1, sum = 0;
loop:
if (i <= 100) {
sum += i;
i++;
goto loop;
}
printf("%d\n", sum); // 5050
return 0;
}
此即「手工組裝」的 while 迴圈,結構混亂、難維護。
break、封裝函式 + return、setjmp/longjmp(極少用)。for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
for (k = 0; k < K; k++)
if (error) goto cleanup; // 直接跳出三層
cleanup:
release_resources();
此時 goto 反而比多層 break+旗標更清晰。但即便如此,建議重構為函式:
int process(void) {
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
for (k = 0; k < K; k++)
if (error) return -1;
return 0;
}
goto 是「核武器級」語句:存在即合理,但 99.9% 情況下不應使用。現代 C 開發應堅持結構化原則,僅在極罕見、經團隊評審同意的多層跳出場景謹慎啟用,並加註釋說明理由。