c语言---16 关于goto语句

本文探讨了C语言中goto语句的作用,通过示例展示了如何避免死循环并演示了其在复杂嵌套结构中的合理使用,包括关机程序和多层循环场景。强调了虽然goto不推荐滥用,但在特定条件下仍具价值,并给出了使用while循环替代的改进版代码。
摘要由CSDN通过智能技术生成

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值