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语句了,程序会报错
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐