C语言速成秘籍——跳转语句(goto)

目录

📝学习预警:

前面我们学习了循环结构和跳转语句(break、continue),如果没有学习这节的可以打开下面的链接进行学习

本节我们会学习另一个跳转语句(goto),这个较前两个复杂很多,这个可以作为拓展学习,不要求掌握。

  • 我们会学习goto语句的基本语法,和goto联合使用的标签
  • goto用于实现无条件跳转。 它允许程序直接跳转到代码中的指定位置(标签),从而改变程序的执行流程。
  • 标签的作用(代码位置的标记点) ,个人觉得这部分需要消化理解一下,因为最开始我把标签 误认为 是函数作用域了,实则不然

下面我们正式开始学习该语句👇


什么是goto语句❓

  • goto是C语言中的一个关键字 ,用于实现无条件跳转。 它允许程序直接跳转到代码中的指定位置,从而改变程序的执行流程。 尽管在现代编程中不推荐使用 ,但在某些特定场景下仍然有其价值。
  • goto语句只能实现在 同一个函数内跳转到设置好的标号处

✍️goto的基本语法 + 标签的作用 + 理解

下面是它的基本语法,单看可能不太能理解,后面有例题,结合例题进行理解。

c 复制代码
基本语法:
goto label_name;
// ... 其他代码
label_name:
    // 语句
  1. 标签名(label_name) 是程序员 自定义的标识符 ,后面用冒号分隔
  2. 程序执行到goto语句(goto label_name;)时,会直接跳转到对应的标签位置继续执行。

标签的作用

  1. 标签只标记位置,标签(如 label_a: 和 label_b:)的本质是代码位置的标记点,类似于书签或地址标签
  2. 标签的本质 :标签只是给紧随其后 的单条语句加了一个可以跳转到的"地址"
  3. 执行模型:通过 goto 跳转,程序都只是从标签标记的位置开始继续顺序执行
c 复制代码
#include <stdio.h>
int main() 
{
    printf("程序开始\n");    // 语句1

label_a:                    // 位置标记A(标签)
    printf("1\n");          // 语句2
    printf("2\n");          // 语句3

label_b:                    // 位置标记B(标签)
    printf("3\n");          // 语句4
    printf("4\n");          // 语句5
    return 0;               // 语句6
}
*****************************************
顺序执行时的流程:
1、执行语句1
2、遇到label_a: - 忽略,继续执行
3、执行语句2
4、执行语句3
5、遇到label_b: - 忽略,继续执行
6、执行语句4
7、执行语句5
8、执行语句6

下面的代码中:

  • 当执行 goto label_b 时,程序跳转到 label_b: 这个位置
  • 然后从该位置开始顺序执行后面的所有语句:printf("3\n"); → printf("4\n"); → return 0;
  • label_b: 只是标记了开始执行的位置,而不是定义了一个代码块
c 复制代码
#include <stdio.h>
int main() 
{
    printf("程序开始\n");
    goto label_b;  // 直接跳转到label_b

label_a:
    printf("1\n");
    printf("2\n");

label_b:
    printf("3\n");
    printf("4\n");
    return 0;
}

为了更好的理解,我们来看一下下面的简单的代码:

  • 这段代码作为了解其基本语法的大致使用
c 复制代码
#include <stdio.h>
int main()
{
	int i = 0;
	printf("请输入i的值:");
	scanf("%d", &i);
	printf("hhh\n");
	if (i < 0)
		goto label_1;		//要跳转到label_1的标签处
	printf("www\n");		//如果运行了上面的goto语句,就不会打印这个

label_1:	//标签
	printf("%d < 0\n", i);		
	return 0;		
}
******************************
输出:
请输入i的值:-9
hhh
-9 < 0
****************
请输入i的值:0
hhh
www
0 < 0

通过上面的代码,我们大致了解了goto的语法,但会发现还是会有不理想的情况实现(比如 i 输入的值是大于等于0的情况)

  • label_1 标签直接放在正常代码流程中 ,导致无论是否执行 goto 语句,标签后的代码都会被执行; 本质是代码位置的标记点
c 复制代码
代码改写(纠错):
#include <stdio.h>
int main()
{
	int i = 0;
	printf("请输入i的值:");
	scanf("%d", &i);
	printf("hhh\n");
	if (i < 0)
		goto label_1;		//跳转到label_1的标签处
	printf("www\n");		//如果运行了上面的goto语句,就不会打印这个
	goto end;		//跳转到end的标签处

label_1:	//标签,尽管没有运行goto语句,也会按程序一条一条语句执行
	printf("%d < 0\n", i);		

end://标签
	return 0;		
}

❗️使用注意:

goto语句如果使用不当,会导致其在函数内部随意跳转,打乱程序执行流程,建议是能不使用则不使用。但goto并非只有坏处,也有好处(可以跳出深层嵌套循环)

  • goto语句是C语言中一个强大的工具 ,但需要谨慎使用。在适当的场景下(如错误处理),它可以写出更清晰、更高效的代码。
  • 限制使用:goto语句应该谨慎使用 ,通常只在以下情况考虑:
    • 错误处理和资源清理
    • 跳出深层嵌套循环
  • 避免滥用:过度 使用goto会使代码难以理解和维护 ; 跳转创建隐式循环
  • 标签命名:使用有意义的标签名称,如error_handler、cleanup等。
c 复制代码
不恰当使用goto(导致的死循环):
#include <stdio.h>
int main()
{
printf:
	printf("hhh\n");
	printf("www\n");

	goto printf;
	return 0;
}

跳离深层循环嵌套:

  • 下面是三层嵌套循环,如果要跳离循环,我们可以使用break,但这个只能一层一层的跳离 ,使用 goto可以直接跳到标签处,离开嵌套循环
c 复制代码
goto(跳离深层循环嵌套):
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	int k = 0;
	for (i = 1; i <= 10; i++)
	{
		for (j = 1; j <= 10; j++)
		{
			for (k = 1; k <= 10; k++)
				printf("hhh\n");
			goto end;		//直接跳离第二层循环
		}
	}
end:
	printf("exit!\n");
	return 0;
}

💻上机练习:

1️⃣使用goto语句打印1到5的数字

要求:

  • 每个数字间要有空格或跳格
c 复制代码
#include<stdio.h>
int main()
{
	int i = 0;
print:
	i++;
	if (i <= 5)
	{
		printf("%d\t", i);
		goto print;
	}
	return 0;
}

2️⃣使用goto语句计算1到10的和

  • 要打印每次计算过程
  • 比如:
    • 0+1=1
    • 1+2=3
    • 3+3=6
    • 6+4=10
    • ...直到计算完
c 复制代码
#include<stdio.h>
int main()
{
	int i = 0;
	int sum = 0;
count:
	i++;
	if (i <= 10)
	{
		sum = sum + i;
		printf("%d + %d = %d\n", sum - i, i, sum);
		goto count;
	}
	return 0;
}

3️⃣使用goto创建一个简单的菜单系统

要求:

  • 用户可以重复选择,每次都要打印菜单再进行选择,直到选择退出
    1. 选项1
    2. 选项2
    3. 选项3
    4. 退出
c 复制代码
#include<stdio.h>
int main()
{
menu:
	printf("1. 选项1\n");
	printf("2. 选项2\n");
	printf("3. 选项3\n");
	printf("4. 退出\n");
	int i = 0;
	printf("请选择所想要的选项:");
	scanf("%d", &i);
	switch (i)
	{
	case 1:
		printf("\n选项1\n");
		goto menu;
	case 2:
		printf("\n选项2\n");
		goto menu;
	case 3:
		printf("\n选项3\n");
		goto menu;
	case 4:
		printf("\n选项4\n");
		break;
	default:
		printf("\n选项错误,请重新选择!\n");
		goto menu;
	}
	return 0;
}

✒️小结:

  • 以上就是C语言中goto语句的学习,这个语句有几个要注意的
    • 只能在同一个函数内进行跳转使用,不可跨函数
    • 标签相当于代码的定位地址
    • 这个常用在深层循环嵌套里的跳出
    • 尽量不要使用(如果在不是很熟悉的情况下),使用时不用乱用,练习时可以尝试一下有没有其他好玩的用法

除了上面的练习题,还有一道较难的练习题在这个链接中,想看的可以打开看看🔗循环嵌套练习

  • 以上就是教学内容,如有错误和不足欢迎大家在评论区指出,感谢大家浏览!🌹🌹
相关推荐
pixelpilot3 小时前
Nimble:让SwiftObjective-C测试变得更优雅的匹配库
开发语言·其他·objective-c·swift
matrixmind13 小时前
Nivo 用React打造精美数据可视化的开源利器
其他·react.js·信息可视化·开源
蓝桉_An3 小时前
CNN基础学习(自用)
神经网络·学习
huangql5204 小时前
基于前端+Node.js 的 Markdown 笔记 PDF 导出系统完整实战
前端·笔记·node.js
Han.miracle5 小时前
数据结构——二叉树学习
数据结构·学习
Demoncode_y5 小时前
Vue3中基于路由的动态递归菜单组件实现
前端·javascript·vue.js·学习·递归·菜单组件
HalvmånEver5 小时前
初学者入门 C++ map 容器:从基础用法到实战案例
开发语言·c++·学习·map
ljt27249606615 小时前
Compose笔记(五十一)--rememberTextMeasurer
android·笔记·android jetpack
迎風吹頭髮5 小时前
UNIX下C语言编程与实践20-UNIX 文件类型判断:stat 结构 st_mode 与文件类型宏的使用实战
linux·c语言·unix