C语言的底层逻辑剖析分支与循环补充(goto语句)
goto语句
在C语言中我们还提供了一种可以随意滥用的语句叫做goto语句,顾名思义goto就是到哪里去的意思,我们来以下面代码来示例:
#include <stdio.h>
int main()
{
again:
printf("hello world\n");
goto again;
return 0;
}
这个就是goto语句最简单的示例,如果你将此代码放到编译器中运行,你会发现这其实是一个死循环的打印hello world,原因就是每次执行完printf之后遇到了goto语句,又回到了上方again处。可以看到goto语句其实非常简单暴力的,但是也是因为它太简单暴力在程序中我们要尽量避免使用,因为它会打乱我们程序的逻辑,当然它也有自己特殊的应用场景,比如下面:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
当我们有多层循环需要跳出来的时候,如果一层一层地用break跳出来就显得很麻烦,这时候goto语句的简单暴力就很好用了。
下面我们来举一个小小的例子:
我们用goto语句来写一个有意思的关机小程序,
int main()
{
int i = 0;
char arr[] = {""};
printf("电脑将在60秒后关机,请输入:我是猪取消关机\n");
system("shutdown -s -t 60");
while (1)
{
scanf("%s", arr);
if (strcmp(arr, "我是猪") == 0)
{
printf("小乖乖,这就取消关机\n");
system("shutdown -a");
}
else
printf("真的不说吗,快要关机了哦\n");
}
return 0;
}
这里我们用的是while循环,当然我们也可以直接用goto语句来实现,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int i = 0;
char arr[] = {""};
printf("电脑将在60秒后关机,请输入:我是猪取消关机\n");
system("shutdown -s -t 60");
again:
scanf("%s", arr);
if (strcmp(arr, "我是猪") == 0)
{
printf("小乖乖,这就取消关机\n");
system("shutdown -a");
}
else
printf("真的不说吗,快要关机了哦\n");
goto again;
return 0;
}
虽然goto语句确实看起来很好用,但是还是非常不推荐,因为不稳定性太强了,会让你的代码逻辑变得很乱,所以我们基本不会使用goto语句,除非有一些特别紧急保护程序或者一些特定情况才会使用,所以只要作为了解即可。