goto语句
C语言中提供了可以随意滥用的goto语句和标记跳转的标号。
通常意义上来说,由于goto语句可以哪里都可以用;因此,goto语句可能会有一些破坏性的工作,一般建议大家不去使用。(如果没有更好的方案替代,一定要使用goto语句的情况除外)
从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
简单介绍一下goto语句:
int main(){
again:
printf("hello\n");
goto again;
return 0;
}
这个代码的的意思是,程序一进入主函数之后,先不管again,先进行打印,来到goto again;后,再重新返回上面的again,程序再往下执行。
因此,会一直打印,陷入死循环。
goto语句——是跳到哪里去;
这里again其实是一个符号,意思是我放到哪里,goto就跳到哪里去。
在举例——
int main(){
printf("hello\n");
goto again;
printf("你好\n");
again:
printf("hehe\n");
return 0;
}
这个代码打印的结果是hello和hehe。
会发现goto语句跳过了“你好”打印的语句;所以,goto语句可以在我们的代码中随意乱跳。
那这个时候,会容易让我们的代码的执行流程打乱;也就是说原本我们的代码是从上往下执行的,但如果遇到goto语句的话,就可能会跳到其他地方;这样跳来跳去的话,可能最后会导致最后连自己也不知道代码的执行逻辑。
goto语句会打乱我们程序原有的执行节奏,所以,我们特别在使用goto语句的时候会很容易写出bug;因此,建议大家以后在写代码的时候,尽量少用goto语句。
当然,这不是说goto语句一无是处,它也有自己应用的场景。
最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层的循环。
如:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
...
error:
if(disaster)
// 处理错误情况
disaster——灾难。
在这三层循环中,如果来到遇到 if(disaster),灾难发生的话,就不能处理我们的逻辑,就去处理灾难去。
此时,如果没有goto语句,我们进入多次嵌套循环的内部的时候,遇到灾难时,想要返回处理,就要一直break返回上一次循环,且每一次的break都有自己的触发条件,这样会比较麻烦。
这时,就体现goto语句的重要性了,只要我们 if(disaster)后,goto error;就会跳出来,跳出来后,就可以在外部处理相应的错误情况。
这个时候,就很容易跳处出嵌套的深层次的结构,这就是goto语句的天然使用。
goto语句的应用例子——一个关机程序
关机程序跑起来之后,电脑会在一分钟之后关机,如果我们在这一分钟之内输入想要的内容,就取消关机,怎么做?
如何用c语言来让电脑关机?
这里提供一个关机的命令——shutdown -s -t 60
意思是:-s设置关机;-t设置时间关机;60指60秒之后关机。
电脑中有一个cmd命令——command命令行,如果我们在这里输入shutdown -s -t 60后,电脑会在一分钟之后关机。
而取消的话,则是要输入——shutdown -a取消关机。
那该如何写c语言代码呢?
C语言提供一个函数——system()——执行系统命令的
system("shutdown -s -t 60");//执行让电脑在60秒之后关机的命令
只要代码执行这句话,那这句命令也就会开始执行。
之后,就是在后面在写一句提示,和用scanf来接收——
char input[20]={0};
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
之后,就需要判断所输入的内容是否一样,就需要比较字符串,如何比较呢?
这里就用到strcmp函数——用来比较字符串。
if(strcmp(input, "我是猪")==0)
{
system("shutdown -a");
}
else
{
goto again;
}
如果输入一样,就则取消关机;如果不一样,就再给机会。
此时,goto again;就会返回到again部分;如此反复,直至一分钟结束。
【注:system函数的要有对应的头文件——#include<stdlib.h>;strcmp函数——#include<string.h>】
所以——
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
again:
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
这里,我们都说goto语句不建议使用,那能否在不使用goto语句的情况下,执行我们想要的关机代码呢?
用循环的方法解决。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
while(1)
{
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
break;
}
}
return 0;
}
这里在提一点——
打开电脑里的服务,里面的任何一个服务程序都可以点起来,随便点一个,右击点属性,然后会看到有一个启动类型(有手动和自动)
我们任何一个在这里产生的服务,就是我们的可执行程序;而我们刚刚所写的关机程序也编成一个可执行程序(.exe文件就是可执行程序)
大家可以试着去搜索如何将可执行程序添加到服务里头(可以用命令的方式添加),而添加好之后,我们可以将启动类型改为自动,这样就意味着只要你操作系统执行起来,那么你的电脑就会在一分钟之内关机(操作系统执行起来就会把服务执行起来,而我们刚刚设置自动,那么就会执行)
这样,你的电脑开起来,就又会在一分钟之内关机;如此反复,就像中了病毒一样,这样就可以做一些有趣的事情(比如拿你朋友的电脑来试。)
但这只是建议,不推荐小白去做,到时搞不回来就完了。