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

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

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.hskmm.com/?act=detail&tid=23763

相关文章:

  • 五子棋-下满了格子平局
  • 从免疫原性突破到技术迭代:全人源抗体如何重塑靶向治疗格局?
  • 工作感受月记(202510月)
  • 欧几里得算法与扩展欧几里得算法详解
  • 题解:AT_agc038_f [AGC038F] Two Permutations
  • 10.3 考试总结
  • CSP-S 复赛指南(2025年版)
  • AI元人文系列文章:AI元人文的未来——软硬件协同
  • 10.3考试反思
  • 10.2 考试总结
  • 20251003国庆模拟3
  • 20251002国庆模拟2
  • ハレハレヤ
  • 4-创建索引和约束 - 实践
  • 2025十一集训——Day2做题
  • 核聚变:Commonwealth Fusion Systems
  • 占个位置~
  • AI元人文系列文章:价值决策芯片——为机器安上一颗“透明的心”
  • 30天JavaScript挑战 - 从零基础到精通的完整学习指南
  • 题解:AT_agc057_c [AGC057C] Increment or Xor
  • 占个位置
  • 使用 Copilot AI + Blazor 编一个五子棋游戏
  • 关于VMware虚拟机如何下载-2025.10.3
  • 国庆集训做题10.1 - 10.3
  • 玳瑁的嵌入式日记---0928(ARM--UART) - 指南
  • 解决Visual Studio中无法使用scanf和C++万能头的问题
  • 英文笔记
  • 解码红黑树
  • 10/3
  • Advanced Computer Graphics