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

C語言 goto 語句與 goto 迴圈:歷史遺留還是必要之惡?

     編輯:關於C語言

goto 是 C 語言提供的無條件跳轉語句,雖然結構化程式設計理念極力反對使用,但在特定極端場景(如多層巢狀迴圈緊急跳出)仍有其生存空間。本文解析語法、風險與唯一建議用法。

語法與機制

goto label;
...
label: statement;
  • label 為標識符 + 冒號 :,作用域限定於同一函式內。
  • 通常搭配 if 使用:if (condition) goto label;
  • 執行時無條件跳轉至標籤處繼續執行。

範例 6-1:goto 構建迴圈求 1+...+100

#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 迴圈,結構混亂、難維護。

為何現代開發禁用 goto?

  1. 破壞結構化: 程式流程如義大利麵條,難以閱讀、除錯、重構。
  2. 變數作用域混淆: 跳轉可能跨過變數初始化,導致未定義行為。
  3. 巢狀迴圈替代方案更優: 標誌變數 + 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 開發應堅持結構化原則,僅在極罕見、經團隊評審同意的多層跳出場景謹慎啟用,並加註釋說明理由。

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