使用 C 語言中的 goto 語句

Jinku Hu 2023年1月30日 2021年2月28日
  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 <string.h>
#include <stdlib.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 <string.h>
#include <stdlib.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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn