1、goto语句
C语言提供了可以随意使用的goto语句和标记跳转的标号,但是不建议用goto语句。从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易地写出代码,但是某些场合中goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次性跳出两层或多层循环,这种情况下使用break是达不到目的的,因为break它只能从最内层循环退出到上一层循环。
2、示例
示例一:验证goto语句的功能
#include <stdio.h>
int main()
{
flag:
printf("haha\n");
printf("hello\n");
goto flag;
return 0;
}
运行完该程序之后,会出现死循环,终端会持续打印haha和hello。因为程序一开始,先进入flag,打印haha,而后打印hello,接着程序会到达“goto flag”,有开始执行flag下的打印haha以及hello语句,循环往复,也没有停止的指令,所以程序会出现死循环的情况。
并不是说goto语句执行完之后会死循环,是这个示例将代码写成了死循环,不能对goto语句产生死循环的误解。
示例二:关机小程序
来写一个关机小程序,该程序的功能是:只要该程序运行起来,如果不进行操作,电脑就在一分钟之内关掉,如果输入“你相信光吗”,就取消关机。
在windows下的命令提示符里面,我们输入shutdown -s -t 60
,电脑就会出现下面的提示,因为该条命令是指:-s 设置关机 -t设置关机时间 60是指设置关机时间是60秒,shutdown是用到的工具。
如何取消该操作呢?输入命令shutdown -a
,该条命令为取消关机操作。
如何用C语言将这一系列的操作实现呢?C语言提供了一个函数实现该功能,system()----是用来执行系统命令的。system依赖的头文件是stdlib.h;strcmp依赖的头文件是string.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char input[20] = { 0 };//存放输入的信息,输入的信息是字符串
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑将在1分钟内关机,如果输入:你相信光吗,就取消关机\n");
scanf("%s",input);//因为input是一个数组,数组名本来就是一个地址,所以scanf这里的input前面就不用写&来取地址了
//如果scanf里面的是是变量的话,就要加上取地址符了
if (strcmp(input, "你相信光吗") == 0 )//比较字符串,两个字符串比较的时候一定不能用等号
//字符串比较应该用strcmp()--全称是string compare
{
system("shutdown -a");
}
else
{
goto again;//再给一次重新输入的机会
}
return 0;
}
请注意,你的电脑将在1分钟内关机,如果输入:你相信光吗,就取消关机
你相信
请注意,你的电脑将在1分钟内关机,如果输入:你相信光吗,就取消关机
你相信光吗
但是goto语句不够好,尽量不要用这个语句。上面的代码无非是想要代码循环起来,利用goto语句走上去循环一次打印"请注意…"以及输入信息,直接给它搞成循环就可以啦。
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("请注意,你的电脑将在1分钟内关机,如果输入:你相信光吗,就取消关机\n");
scanf("%s", input);
if (strcmp(input, "你相信光吗") == 0)//比较字符串,两个字符串比较的时候一定不能用等号
{
system("shutdown -a");
break;
}
}
return 0;
}
这段代码与goto语句那段代码的功能是一样的。
将“Debug”改为“release”,然后再执行一次,就可以在代码所在的文件夹下得到一个可执行程序,直接执行该可执行程序就可以执行写的这段代码。
示例三:goto语句真正适合的场景(跳出多层循环)
for(...)
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
...
error:
if(disaster)
//处理错误情况
error只要放在这三成循环的外面,就使用goto语句直接到error这儿了,不用在退出每一层循环的时候都使用一次break。
但是goto语句只能在一个函数范围内跳转,不能跨函数!!!
void test()
{
flag:
printf("test\n");
}
int main()
{
goto flag;
return 0;
}
这样的写代码的写法就属于是跨函数使用goto语句了,程序会报错