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
广告