使用 C 語言中的 goto 語句

Jinku Hu 2023年10月12日
  1. 使用 goto 語句在 C 語言中實現迴圈
  2. 在 C 語言中使用 goto 語句來擺脫巢狀迴圈
使用 C 語言中的 goto 語句

本文將演示關於如何在 C 語言中使用 goto 語句的多種方法。

使用 goto 語句在 C 語言中實現迴圈

goto 關鍵字是 C 語言的一部分,它提供了一個做無條件跳轉的結構。ifswitch 語句是條件跳轉的例子。goto 構造由兩部分組成:goto 呼叫和標籤名。程式碼中的任何語句都可以在前面加一個標籤,標籤只是一個識別符號,後面加一個冒號。goto 呼叫強制程式碼執行跳轉到標籤後的第一條語句。goto 只能跳轉到同一個函式內部的標籤,而且標籤在整個函式中都是可見的,無論在哪一行定義。

在下面的例子中,我們演示了一個簡單的迴圈,在每個迴圈中比較變數 score1000。如果 score 小於等於,它就遞增並再次跳轉到比較語句。一旦 if 語句為真,再呼叫一次 goto 呼叫,執行跳轉到 EXIT 標籤,導致程式正常終止。這個例子程式碼和其他很多例子程式碼類似,可以不使用 goto 語句重新實現,因此比較容易閱讀。一般來說,關於 goto 語句的爭論非常激烈,有人認為它對可讀程式碼完全是有害的,也有人仍然認為它有一些實際的用例。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern char **environ;

int main(int argc, char *argv[]) {
  int score = 1;

START:
  if (score > 1000) goto EXIT;

  score += 1;
  goto START;

EXIT:
  printf("score: %d\n", score);
  exit(EXIT_SUCCESS);
}

輸出:

score: 1001

在 C 語言中使用 goto 語句來擺脫巢狀迴圈

goto 語句可以很好的改變控制流程,如果迴圈裡面的條件語句滿足,有些程式碼也應該跳過。下面的程式碼示例演示了一個類似的場景,環境變數陣列被訪問和搜尋。注意,外層的 if 語句檢查指標是否有效,然後才繼續執行迴圈。迴圈本身內部還有一個條件,它檢查每個環境變數的具體字串。如果找到了字串,我們就可以脫離迴圈,不浪費更多的處理資源,跳過下面的 printf 語句。這就為內部 if 語句內包含的 goto 呼叫創造了一個有用的情景,可以使程式跳出外部的 if 語句,繼續執行其餘的程式碼。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern char **environ;

int main(int argc, char *argv[]) {
  if (environ != NULL) {
    for (size_t i = 0; environ[i] != NULL; ++i) {
      if (strncmp(environ[i], "HOME", 4) == 0) {
        puts(environ[i]);
        goto END;
      }
    }
    printf("No such variable found!\n");
  }
END:

  exit(EXIT_SUCCESS);
}

輸出:

HOME=/home/username
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook