C語言中的goto語句



什麼是C語言中的goto語句?

goto語句用於將程式的控制轉移到同一函式內定義的標籤。它是一個無條件跳轉語句,可以向前或向後轉移控制。

goto關鍵字後跟一個標籤。當執行時,程式控制將重定向到標籤後面的語句。如果標籤指向程式碼中任何較早的語句,則構成一個迴圈。另一方面,如果標籤引用進一步的步驟,則等效於跳轉。

goto語句語法

goto語句的語法如下:

goto label;
. . .
. . .
label: statement;

標籤是C語言中任何有效的識別符號。標籤必須包含字母數字字元以及下劃線符號(_) 。與任何識別符號一樣,同一個標籤不能在一個程式中多次指定。它後面總是跟著一個冒號(:)符號。當goto將程式重定向到這裡時,此冒號後的語句將被執行。

goto語句流程圖

下圖顯示了goto語句的工作原理:

Goto statement in C

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

c_loops.htm
廣告