当前位置: 首页 > news >正文

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

目录

  • 什么是`goto`语句:question:
  • :writing_hand:`goto`的基本语法 + 标签的作用 + 理解
  • :exclamation:使用注意:
  • :computer:上机练习:
    • :one:使用goto语句打印1到5的数字
    • :two:使用goto语句计算1到10的和
    • :three:使用goto创建一个简单的菜单系统

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

  • 🔗循环结构和跳转语句的学习

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

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

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


什么是goto语句❓

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

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

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

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

标签的作用

  1. 标签只标记位置,标签(如 label_a: 和 label_b:)的本质是代码位置的标记点,类似于书签或地址标签
  2. 标签的本质:标签只是给紧随其后的单条语句加了一个可以跳转到的"地址"
  3. 执行模型:通过 goto 跳转,程序都只是从标签标记的位置开始继续顺序执行
#include <stdio.h>
int main() 
{printf("程序开始\n");    // 语句1label_a:                    // 位置标记A(标签)printf("1\n");          // 语句2printf("2\n");          // 语句3label_b:                    // 位置标记B(标签)printf("3\n");          // 语句4printf("4\n");          // 语句5return 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: 只是标记了开始执行的位置,而不是定义了一个代码块
#include <stdio.h>
int main() 
{printf("程序开始\n");goto label_b;  // 直接跳转到label_blabel_a:printf("1\n");printf("2\n");label_b:printf("3\n");printf("4\n");return 0;
}

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

  • 这段代码作为了解其基本语法的大致使用
#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 语句,标签后的代码都会被执行; 本质是代码位置的标记点
代码改写(纠错):
#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等。
不恰当使用goto(导致的死循环):
#include <stdio.h>
int main()
{
printf:printf("hhh\n");printf("www\n");goto printf;return 0;
}

跳离深层循环嵌套:

  • 下面是三层嵌套循环,如果要跳离循环,我们可以使用break,但这个只能一层一层的跳离,使用 goto可以直接跳到标签处,离开嵌套循环
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的数字

要求:

  • 每个数字间要有空格或跳格
#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
    • …直到计算完
#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. 退出
#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语句的学习,这个语句有几个要注意的
    • 只能在同一个函数内进行跳转使用,不可跨函数
    • 标签相当于代码的定位地址
    • 这个常用在深层循环嵌套里的跳出
    • 尽量不要使用(如果在不是很熟悉的情况下),使用时不用乱用,练习时可以尝试一下有没有其他好玩的用法

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

  • 以上就是教学内容,如有错误和不足欢迎大家在评论区指出,感谢大家浏览!🌹🌹
http://www.dtcms.com/a/434826.html

相关文章:

  • WPF实现串口热插拔 (提供百度网盘源代码)
  • 企业网站关键词排名南京比较好的网络策划公司
  • FFmpeg 核心 API 系列:avcodec_find_decoder / avcodec_alloc_context3 / avcodec_open2
  • 文件上传简单的绕过总结
  • Visual Studio Code中launch.json深度解析:C++调试的艺术
  • 天长市建设局网站惠来做网站
  • 51单片机红外遥控
  • Java 集合 “List + Set”面试清单(含超通俗生活案例与深度理解)
  • 云南网站建设哪个好软文广告平台
  • 《嵌入式 – GD32开发实战指南(RISC-V版本)》第8章 PWM输出实现
  • HNU 编译系统 第一次作业
  • 网站怎么做交易平台图片生成网页链接在线
  • 渗透测试中的信息收集:文档元数据
  • minikube 的 kubernetes 入门教程-kubeSphere
  • 深圳 手机网站建设彩妆做推广的网站
  • 网站跳转是什么意思郑州建站网站的公司
  • 老题新解|再求 f(x,n)
  • 【Android cmd命令的执行流程】
  • c++26新功能—constexpr在稳定排序中的应用
  • AI生成悬疑故事
  • 泰山派rk3566烧录
  • Phpstudy博客网站apache2日志分析python代码
  • asp网站程序优点做App和网站 聚马
  • 免费软件下载网站入口正能量微信开发公众平台
  • 【系统重装】Windows无法安装到这个磁盘提示选中的磁盘具有MBR分区表解决方法(亲测有效)
  • MySQL 查询与更新语句执行过程深度解析:从原理到实践​
  • Bella Beauty – Aesthetic Medical Clinic WordPress Theme: A Practical
  • 洗车店会员管理系统数据分析
  • 门户网站的意思wordpress 导航 防刷新
  • 虚幻基础:角色受击