使用 C 語言中的 goto 語句
Jinku Hu
2023年10月12日
本文將演示關於如何在 C 語言中使用 goto
語句的多種方法。
使用 goto
語句在 C 語言中實現迴圈
goto
關鍵字是 C 語言的一部分,它提供了一個做無條件跳轉的結構。if
和 switch
語句是條件跳轉的例子。goto
構造由兩部分組成:goto
呼叫和標籤名。程式碼中的任何語句都可以在前面加一個標籤,標籤只是一個識別符號,後面加一個冒號。goto
呼叫強制程式碼執行跳轉到標籤後的第一條語句。goto
只能跳轉到同一個函式內部的標籤,而且標籤在整個函式中都是可見的,無論在哪一行定義。
在下面的例子中,我們演示了一個簡單的迴圈,在每個迴圈中比較變數 score
和 1000
。如果 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