
- C程式設計教程
- C - 首頁
- C語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境搭建
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林型別
- C語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof運算子
- C - 運算子優先順序
- C - 其他運算子
- C語言中的決策
- C - 決策
- C - if語句
- C - if...else語句
- C - 巢狀if語句
- C - switch語句
- C - 巢狀switch語句
- C語言中的迴圈
- C - 迴圈
- C - while迴圈
- C - for迴圈
- C - do...while迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break語句
- C - continue語句
- C - goto語句
- C語言中的函式
- C - 函式
- C - 主函式
- C - 按值傳遞函式呼叫
- C - 按引用傳遞函式呼叫
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者自定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 變長陣列
- C語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指向指標的指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void指標
- C - 野指標
- C - 解引用指標
- C - 近、遠和巨大指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點(.)運算子
- C - 列舉(或enum)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - Typedef
- C語言中的檔案處理
- C - 輸入與輸出
- C - 檔案I/O(檔案處理)
- C預處理器
- C - 預處理器
- C - 編譯指示
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類別
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static關鍵字
- C - 隨機數生成
- C - 命令列引數
- C程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C語言中的goto語句
什麼是C語言中的goto語句?
goto語句用於將程式的控制轉移到同一函式內定義的標籤。它是一個無條件跳轉語句,可以向前或向後轉移控制。
goto關鍵字後跟一個標籤。當執行時,程式控制將重定向到標籤後面的語句。如果標籤指向程式碼中任何較早的語句,則構成一個迴圈。另一方面,如果標籤引用進一步的步驟,則等效於跳轉。
goto語句語法
goto語句的語法如下:
goto label; . . . . . . label: statement;
標籤是C語言中任何有效的識別符號。標籤必須包含字母數字字元以及下劃線符號(_) 。與任何識別符號一樣,同一個標籤不能在一個程式中多次指定。它後面總是跟著一個冒號(:)符號。當goto將程式重定向到這裡時,此冒號後的語句將被執行。
goto語句流程圖
下圖顯示了goto語句的工作原理:

goto語句示例
示例1
在下面的程式中,控制跳轉到一個給定的標籤,該標籤位於當前語句之後。它列印一個給定的數字,然後列印程式結束訊息。如果它是“0”,它將跳到printf語句,顯示訊息。
#include <stdio.h> int main (){ int n = 0; if (n == 0) goto end; printf("The number is: %d", n); end: printf ("End of program"); return 0; }
輸出
執行程式碼並檢查其輸出:
End of program
示例2
這是一個程式,用於檢查給定數字是偶數還是奇數。觀察我們在本程式中如何使用goto語句:
#include <stdio.h> int main (){ int i = 11; if (i % 2 == 0){ EVEN: printf("The number is even \n"); goto END; } else{ ODD: printf("The number is odd \n"); } END: printf("End of program"); return 0; }
輸出
由於給定數字是11,因此它將產生以下輸出:
The number is odd End of program
更改數字並檢查不同數字的輸出。
示例3
如果goto無條件出現並且向後跳轉,則會建立無限迴圈。
#include <stdio.h> int main (){ START: printf("Hello World \n"); printf("How are you? \n"); goto START; return 0; }
輸出
執行程式碼並檢查其輸出:
Hello World How are you? ....... .......
該程式連續列印兩個字串,直到強制停止。
示例4
在此程式中,我們有兩個goto語句。第二個goto語句構成一個迴圈,因為它進行向後跳轉。當滿足條件時,另一個goto語句跳出迴圈。
#include <stdio.h> int main(){ int i = 0; START: i++; printf("i: %d\n", i); if (i == 5) goto END; goto START; END: printf("End of loop"); return 0; }
輸出
執行程式碼並檢查其輸出:
i: 1 i: 2 i: 3 i: 4 i: 5 End of loop
示例5
goto語句用於跳過與其他迴圈變數匹配的所有迴圈變數值。結果,獲得了1、2和3的所有唯一組合。
#include <stdio.h> int main (){ int i, j, k; for(i = 1; i <= 3; i++){ for(j = 1; j <= 3; j++){ if (i == j) goto label1; for (k = 1; k <= 3; k++){ if (k == j || k == i) goto label2; printf("%d %d %d \n", i,j,k); label2: ; } label1: ; } } return 0; }
輸出
執行程式碼並檢查其輸出:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
避免在C語言中使用goto語句
請注意,C語言中的goto被認為是非結構化的,因為它允許程式跳轉到程式碼中的任何位置,這可能使程式碼難以理解、跟蹤和維護。過多的goto語句來回傳送程式控制可能會使程式邏輯難以理解。
著名的計算機科學家dsger Dijkstra建議從所有程式語言中刪除goto。他觀察到,如果程式控制在迴圈中間跳轉,可能會產生不可預測的行為。goto語句可用於建立具有多個入口和出口點的程式,這可能使跟蹤程式的控制流變得困難。
Dijkstra對goto語句使用的強烈反對意見產生了影響,因為許多主流語言都不支援goto語句。但是,它仍然在某些語言(如C和C++)中可用。
通常,最好避免在C語言中使用goto語句。相反,您可以有效地使用if-else語句、迴圈和迴圈控制、函式和子程式呼叫以及try-catch-throw語句。僅當這些替代方案不能滿足您的演算法需求時,才使用goto。