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

news/2025/10/3 21:07:20/文章来源:https://www.cnblogs.com/ljbguanli/p/19124991

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、执行语句12、遇到label_a: - 忽略,继续执行3、执行语句24、执行语句35、遇到label_b: - 忽略,继续执行6、执行语句47、执行语句58、执行语句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的值:-9hhh-9 < 0****************请输入i的值:0hhhwww0 < 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.mzph.cn/news/926316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常州城乡和住房建设厅网站简述建设企业网站可信度的具体策略

作者&#xff1a;vivo 互联网服务器团队- Li Gang 本文介绍了一次排查Dubbo线程池耗尽问题的过程。通过查看Dubbo线程状态、分析Jedis连接池获取连接的源码、排查死锁条件等方面&#xff0c;最终确认是因为使用了cluster pipeline模式且没有设置超时时间导致死锁问题。 一、背…

从免疫原性突破到技术迭代:全人源抗体如何重塑靶向治疗格局?

在治疗性抗体领域,“降低免疫原性” 始终是研发的核心追求 —— 人源化抗体虽通过框架区改造将鼠源序列占比降至 5% 以下(如阿达木单抗),但临床数据显示仍有 3.2% 患者产生抗药抗体(ADA),导致药物清除率提升 50…

实用指南:OpenAI Sora 2重磅发布:AI视频生成进入“GPT-3.5时刻”

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

商业网站的规划和设计linux wordpress 升级

在C语言中&#xff0c;flock 是一个用于文件锁定的函数&#xff0c;定义在 sys/file.h 头文件中。它的主要目的是在对文件进行读写操作时&#xff0c;避免其他进程同时访问文件&#xff0c;以实现文件的并发控制。 flock 函数的原型 #include <sys/file.h>int flock(in…

无锡做网站哪家公司好延庆上海网站建设

题目大意&#xff1a; 有边权点权的树&#xff0c;动态修改点权 每次修改后求带权重心x (\(minimize\) \(S\sum_i val[i]*dist[x][i]\)) 分析&#xff1a; 从暴力找突破口&#xff1a; 对于边x,y&#xff0c;设长度为len&#xff0c;切断后x半边树权值和为\(w_1\)&#xff0c;y…

工作感受月记(202510月)

国庆节在毕节上班一天中...... 2025年10月03号 1/ 值班完成手中TODO list,icm,case,blog,和墨墨记单词270 2/ 整理心态,看queue中 今日关键字:挣钱中

域名就是网站名吗wordpress 消息推送

这里将介绍如何使用 OpenCV 与 Python 来作彩色影像转HSV(RGB to HSV 或 BGR to HSV)&#xff0c;在写 Python 影像处理程序时常会用到 OpenCV cvtColor 作颜色空间转换的功能&#xff0c;接下来介绍怎么使用 Python 搭配 OpenCV 模块来进行 RGB/BGR 转 HSV 彩色转HSV空间。 H…

欧几里得算法与扩展欧几里得算法详解

在数论和密码学中,欧几里得算法(Euclidean Algorithm)是一个古老而重要的算法,用于计算两个整数的最大公约数(GCD)。 欧几里得算法(更相减损法) 欧几里得算法基于以下原理:两个整数的最大公约数等于其中较小的…

网站承建乐山网站公众号建设

前置操作 如果是在 spring-config 中添加 bean 标签来注册内容&#xff0c;每个类都要弄一次就显得麻烦和臃肿了&#xff0c;对于 new 操作而言就没有什么优势了。因此 spring 就引入了注解操作来实现对 Bean 对象的存储。 配置扫描路径 想要将对象成功的存储到 Spring 中&…

网站建设交流发言稿如何建立网站模板

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

题解:AT_agc038_f [AGC038F] Two Permutations

题目: 置换环是显然的,一个环有旋一下和不旋两种状态。 \((P_i=i,Q_i=i,P_i=Q_i)\) 无非这三个限制。\((0,0,0)\):旋一个以上就有贡献。 \((0,0,1)\):旋一个才有贡献。 \((0,1,0)\):旋 P 才有贡献。 \((1,0,0)\):…

完整教程:flink批处理-时间和窗口

完整教程:flink批处理-时间和窗口2025-10-03 20:43 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impo…

详细介绍:Java基础

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

10.3 考试总结

10.3 考试总结10.3 考试总结 题面下载 得分情况 悲痛爆零 时间分配(大概) 8:30 $ \ $ -- $ \ $T1第一版dp写了出来,大样例没过,开始打dfs 9:20 $ \ $ -- $ \ $T1 dfs好像过了,感觉T3更简单,想去打T3 10:10 --…

国庆集训-JDAY3

国庆集训-JDAY3T1 love思路 暴力枚举 解法 枚举天数,累加即可 归纳总结解题策略 枚举 结果 100pts 时间分配 10minT2 square思路 递推,从\(s_1\)推到\(s_n\) 解法 \(s\)每次变成\(s+n个.+s\) 归纳总结解题策略 递归/…

CSP-S 复赛指南(2025年版)

第一章 数据结构 第一节 线性结构 1.1 【5】双端栈 1.1.1 什么是双端栈? 在理解双端栈之前,我们先回顾一下普通的栈。一个普通的栈,所有元素的插入(入栈,push)和删除(出栈,pop)都只能在同一端——也就是“栈…

AI元人文系列文章:AI元人文的未来——软硬件协同

AI元人文系列文章:AI元人文的未来——软硬件协同 当算法的思考开始关乎人类社会的命运,我们需要为它构建一个既能思考也能自省的数字大脑。 引言:从软件困境到硬件曙光 在AI元人文的探索中,我们构想了一个能够理解…

10.3考试反思

今天得了130/400,问题如下: 1.不应盲目直接开始做t1,应先花10mins把所有题看一遍,确定一下大概题型,判断难易程度。 2.考试时不要浮躁,不要说话,认真做题,发挥自己的最大水平。 3.t1正解->30pts,原因是写哈…

10.2 考试总结

10.2 考试总结$ \Huge 10.2 考试总结$ 得分情况预计得分:20+20+0+0 实际得分:0+4+0+0时间分配(大概)8:20 - 9:10 把所有题都看了一遍,决定先做T1 9:10 - 9:50 打出T1第一版过小样例,去做T2(T1最接近正解的一次…