一、问题
goto 语句为⽆条件转向语句,它可以使程序⽴即跳转到函数内部的任意⼀条可执⾏语句,这样使⽤起来⽐较灵活。那么,该语句的基本格式是什么?又该如何使⽤呢?
二、解答
1. goto 语句的基本格式
goto 关键字后⾯带⼀个语句标号,该语句标号是同⼀个函数内某条语句的标号。标号可以出现在任何可执⾏语句的前⾯,并且以⼀个冒号“ :”作为后缀。 通常的情况下,goto 与条件语句配合使⽤,可以⽤来实现条件转移,构成循环或者跳出循环体等功能。⼀般形式为:
goto 语句标号;
在 switch 结构中,每个 case 关键字及后⾯的常量都是⼀个标号。 语旬标号⽤标识符表⽰,要遵循变量名的命名规则,即由字母、数字和下划线组成, 并且第⼀个字符不能是数字。如:
goto 25;
这个语句就是不合法的。
2. goto 语句的使⽤
goto 后的语句标号就是要跳转的⽬标,当然这个语句标号要在程序的其他地⽅给出, 但是其语句标号要在函数内部。例如:
goto Show;
printf("the message before ShowMessage");
Show:
printf("ShowMessage");
上⾯代码中,goto 后的 Show 为跳转的语句标号,⽽其后 “Show:” 代码表⽰ goto 语句要跳转的位置。这样,在上⾯的语句中,第⼀个 printf0函数不会执⾏,⽽会执⾏第⼆个printf()函数。
goto 跳转语句跳转的⽅向可以向前,也可以向后;可以跳出⼀个循环,也可以跳⼊⼀个循环。
下⾯通过⼀个例⼦介绍使⽤ goto 语句如何从循环内部跳出。 要求程序在执⾏循环操作的过程中,当⽤户输⼊退出指令后,程序跳转到循环外部执⾏程序退出前的显示操作,程序代码如下:
#include <stdio.h>
int main()
{int i;int j;for (i = 1; i < 10; i++){printf("Tne i is:%d\n", i);do{printf("Enter a number to j\n");printf("(0 is quit,99 for the next i)\n");scanf("%d", &j);if (j == 0){goto exit;}} while (j != 99);}
exit:printf("Exit the propram!\n");return 0;
}
(1)程序运⾏时,for 循环控制程序步骤,程序输出的循环步骤为1。信息提⽰输⼊数字,其中0表示退出,99 表示下⼀个步骤。
(2)在for 循环中使⽤ do...while 判断⽤户输⼊,当条件为假时,循环结束,执⾏ for 循环的下⼀步。在程序中假如⽤户输⼊数字 3,既不退出也不到下⼀步骤,程序显示继续输⼊数字。当输⼊数字为99 时,跳转到下⼀步,显⽰提示信息 “The step is 2”。
(3)当⽤户输⼊的是0时,那么通过 if 语句进⾏判断为真,执⾏其中的 goto 语句执⾏跳转。其中 exit 为跳转的语句标号。循环的外部使⽤ “exit:”表示 goto跳转的位置,然后执⾏ printf 语句,输出⼀段信息,表⽰程序结束。
程序运⾏结果如图
Tne i is:1
Enter a number to j
(0 is quit,99 for the next i)
3
Enter a number to j
(0 is quit,99 for the next i)
99
Tne i is:2
Enter a number to j
(0 is quit,99 for the next i)
0
Exit the propram!
三、总结
goto 语句虽然能够按照⾃⼰的意愿改变程序的运⾏⽅向,但是这样会使程序流程⽆规律,可读性较差,所以⼀般不使⽤ goto,⽽且它的功能⽤ break 和 continue 都能实现,可以⽤其代替 goto。
说明:
除⾮能较⼤程度地提⾼程序的效率,否则不⽤ goto 语句。