目录
- 什么是`goto`语句:question:
- [:writing_hand:`goto`的基本语法 + 标签的作用 + 理解](#:writing_hand:
goto
的基本语法 + 标签的作用 + 理解) - :exclamation:使用注意:
- :computer:上机练习:
📝学习预警:
前面我们学习了
循环结构和跳转语句(break、continue)
,如果没有学习这节的可以打开下面的链接进行学习本节我们会学习另一个跳转语句(
goto
),这个较前两个复杂很多,这个可以作为拓展学习,不要求掌握。
- 我们会学习
goto
语句的基本语法,和goto联合使用的标签goto
用于实现无条件跳转。 它允许程序直接跳转到代码中的指定位置(标签),从而改变程序的执行流程。- 标签的作用(代码位置的标记点) ,个人觉得这部分需要消化理解一下,因为最开始我把标签 误认为 是函数作用域了,实则不然
下面我们正式开始学习该语句👇
什么是goto
语句❓
goto
是C语言中的一个关键字 ,用于实现无条件跳转。 它允许程序直接跳转到代码中的指定位置,从而改变程序的执行流程。 尽管在现代编程中不推荐使用 ,但在某些特定场景下仍然有其价值。goto
语句只能实现在 同一个函数内跳转到设置好的标号处
✍️goto
的基本语法 + 标签的作用 + 理解
下面是它的基本语法,单看可能不太能理解,后面有例题,结合例题进行理解。
c
基本语法:
goto label_name;
// ... 其他代码
label_name:
// 语句
- 标签名(label_name) 是程序员 自定义的标识符 ,后面用冒号分隔。
- 程序执行到goto语句(goto label_name;)时,会直接跳转到对应的标签位置继续执行。
标签的作用:
- 标签只标记位置,标签(如 label_a: 和 label_b:)的本质是代码位置的标记点,类似于书签或地址标签。
- 标签的本质 :标签只是给紧随其后 的单条语句加了一个可以跳转到的"地址"
- 执行模型:通过
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
- 选项2
- 选项3
- 退出
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
语句的学习,这个语句有几个要注意的
- 只能在同一个函数内进行跳转使用,不可跨函数
- 标签相当于代码的定位地址
- 这个常用在深层循环嵌套里的跳出
- 尽量不要使用(如果在不是很熟悉的情况下),使用时不用乱用,练习时可以尝试一下有没有其他好玩的用法
除了上面的练习题,还有一道较难的练习题在这个链接中,想看的可以打开看看🔗循环嵌套练习
- 以上就是教学内容,如有错误和不足欢迎大家在评论区指出,感谢大家浏览!🌹🌹