在C语言中有一个只要一不小心就会产生bug的语句,那就是goto语句。
C语言提供了可以滥用的goto语句和标记跳转的符号
从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是在某些场合下goto语句还是用得到的,最常见的用法就是***终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。***这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层循环。
对于goto语句的用法我们看下面的代码:
#include<stdio.h>
int main()
{
printf("你好,中国!\n");
goto again;
printf("hello United States!\n");
again:
printf("hello world!");
return 0;
}
运行结果是:
可以看出程序直接跳过hello United States!将“hello world!”打印在屏幕上;
接下来在介绍一个关机程序:
#include<stdio.h>
#include<Windows.h>
#include<string.h>
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");//shutdown -s -t xxx 电脑将在xxx秒后自动关机
again:
printf("请注意:您的电脑将会在一分钟后自动关机!\n如果您不想该电脑关机的话,请输入:我是猪\n");
scanf("%s", input);
if (strcmp(input, "我是猪")==0)//比较两个字符串——strcmp() 需引用头文件string.h
{
system("shutdown -a");//shutdown -a 是终止关机程序
}
else
{
printf("输入无效!\n");
goto again;
}
return 0;
}
在这里goto语句充当循环作用!
可以用循环语句代替:
#include<stdio.h>
#include<Windows.h>
#include<string.h>
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");
while (1)//将判断条件设为1,循环将一直执行
{
printf("请注意:您的电脑将会在一分钟后自动关机!\n如果您不想该电脑关机的话,请输入:我是猪\n");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
break;
}
else
{
printf("输入无效!\n");
}
}
return 0;
}
总之一般goto语句都可以被替换,所以尽量少用goto语句!
但是goto语句也有优点:终止程序在某些深度嵌套的结构的处理过程!
for(...)
{
for(...)
{
while(...)
{
if(...) goto stop;
.
.
.
}
}
}
stop:
像这样使用goto语句将会方便很多,使用break将是不明智的选择!