1、goto语句

C语言提供了可以随意使用的goto语句和标记跳转的标号,但是不建议用goto语句。从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易地写出代码,但是某些场合中goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次性跳出两层或多层循环,这种情况下使用break是达不到目的的,因为break它只能从最内层循环退出到上一层循环。

2、示例

示例一:验证goto语句的功能

#include <stdio.h>
int main()
{flag:printf("haha\n");printf("hello\n");goto flag;return 0;
}

运行完该程序之后,会出现死循环,终端会持续打印haha和hello。因为程序一开始,先进入flag,打印haha,而后打印hello,接着程序会到达“goto flag”,有开始执行flag下的打印haha以及hello语句,循环往复,也没有停止的指令,所以程序会出现死循环的情况。
并不是说goto语句执行完之后会死循环,是这个示例将代码写成了死循环,不能对goto语句产生死循环的误解。
示例二:关机小程序
来写一个关机小程序,该程序的功能是:只要该程序运行起来,如果不进行操作,电脑就在一分钟之内关掉,如果输入“你相信光吗”,就取消关机。
在windows下的命令提示符里面,我们输入shutdown -s -t 60,电脑就会出现下面的提示,因为该条命令是指:-s 设置关机 -t设置关机时间 60是指设置关机时间是60秒,shutdown是用到的工具。

如何取消该操作呢?输入命令shutdown -a,该条命令为取消关机操作。
如何用C语言将这一系列的操作实现呢?C语言提供了一个函数实现该功能,system()----是用来执行系统命令的。system依赖的头文件是stdlib.h;strcmp依赖的头文件是string.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char input[20] = { 0 };//存放输入的信息,输入的信息是字符串system("shutdown -s -t 60");
again:printf("请注意,你的电脑将在1分钟内关机,如果输入:你相信光吗,就取消关机\n");
scanf("%s",input);//因为input是一个数组,数组名本来就是一个地址,所以scanf这里的input前面就不用写&来取地址了//如果scanf里面的是是变量的话,就要加上取地址符了if (strcmp(input, "你相信光吗") == 0 )//比较字符串,两个字符串比较的时候一定不能用等号//字符串比较应该用strcmp()--全称是string compare{system("shutdown -a");}else{goto again;//再给一次重新输入的机会}return 0;
}
请注意,你的电脑将在1分钟内关机,如果输入:你相信光吗,就取消关机
你相信
请注意,你的电脑将在1分钟内关机,如果输入:你相信光吗,就取消关机
你相信光吗

但是goto语句不够好,尽量不要用这个语句。上面的代码无非是想要代码循环起来,利用goto语句走上去循环一次打印"请注意…"以及输入信息,直接给它搞成循环就可以啦。

int main()
{char input[20] = { 0 };system("shutdown -s -t 60");while (1){printf("请注意,你的电脑将在1分钟内关机,如果输入:你相信光吗,就取消关机\n");scanf("%s", input);if (strcmp(input, "你相信光吗") == 0)//比较字符串,两个字符串比较的时候一定不能用等号{system("shutdown -a");break;}}return 0;
}

这段代码与goto语句那段代码的功能是一样的。
将“Debug”改为“release”,然后再执行一次,就可以在代码所在的文件夹下得到一个可执行程序,直接执行该可执行程序就可以执行写的这段代码。


示例三:goto语句真正适合的场景(跳出多层循环)

for(...)for (...){for (...){if (disaster)goto error;}}
...
error:if(disaster)//处理错误情况

error只要放在这三成循环的外面,就使用goto语句直接到error这儿了,不用在退出每一层循环的时候都使用一次break。
但是goto语句只能在一个函数范围内跳转,不能跨函数!!!

void test()
{flag:printf("test\n");
}
int main()
{goto flag;return 0;
}

这样的写代码的写法就属于是跨函数使用goto语句了,程序会报错

c语言---16 关于goto语句相关推荐

  1. C语言之 goto语句怎么了?

    来自学习随笔记,属于[扩展讨论]初学者可以围观看看,看不懂也没关系. goto语句也称为 无条件转移语句,其一般格式如: goto 语句标号: 其中语句标号是标识符规定书写的符号, 放在某一语句行的前 ...

  2. 将 C++ 中的 goto 语句转化为非 goto 语句

    将 C++ 中的 goto 语句转化为非 goto 语句   goto 语句是公认的被编程语言支持但不建议使用的语句.一方面,在某些时候使用 goto 语句能增加代码的可读性,降低其复杂性.另一方面, ...

  3. C++ goto语句详解

    在我看来,C++中让人又爱又恨的,莫过于goto语句了,它功能强大,简答易懂,但是使用多了,容易造成程序诸多问题,今天就带大家来了解一下吧. 目录 一.概念 二.两种观点 三.使用建议 四.个人对待g ...

  4. c语言常用转向的语句,java中类似于C语言的goto无条件转向语句的语法是什么?...

    满意答案 Java不存在goto语句,但是已经用"类名.方法"的形式进行方法调用. 解释:goto语句作为java的保留字段,但是没有实际的应用的.goto语句实际上是C语言的范畴 ...

  5. 两种方式(goto语句以及while循环)实现C语言关机小程序

    用C语言写的关机小程序简单易懂,可以拿去整蛊室友同学(每天一个挨打小技巧),下面我就给出两种方式实现这个代码,欢迎大家讨论补充. 1.用goto语句实现: #include <stdio.h&g ...

  6. c语言goto语句用法_C语言中的goto语句该不该使用?

    关于C语言的goto语句存在很多争议,很多书籍都建议"谨慎使用,或者根本不用".这里先不做过多的讨论,存在即合理,既然是C语言中的一个知识点,我们还是有必要学会使用.先看一些got ...

  7. c语言goto语句用法_硬件工程师必知的10个C语言技巧

    硬件设计师最常见的工作内容是通过写代码来测试硬件.这10个C语言技巧(C语言仍然是常见的选择)可以帮助设计师避免因基础性错误而导致某些缺陷的产生并造成维护方面的困扰. 为了成功的推出一个产品,软件开发 ...

  8. C语言 goto 语句 - C语言零基础入门教程

    目录 一.goto 简介 二.goto 基本语法 三.goto 实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.goto 简介 ...

  9. python语言goto_如何在 Python 中实现 goto 语句

    Python 默认是没有 goto 语句的,但是有一个第三方库支持在 Python 里面实现类似于 goto 的功能:https://github.com/snoack/pyt.... 比如在下面这个 ...

最新文章

  1. swaggerui api.docs
  2. Go基础编程:Go语言介绍
  3. nodejs——URL 基础API
  4. java如何使用类数组_java – 如何使用泛型与数组的类?
  5. python装饰器传递参数_Python装饰器高级版—Python类内定义装饰器并传递self参数...
  6. 题解 POJ 2559-SP1805 【HISTOGRA - Largest Rectangle in a Histogram】
  7. 学会这 6 招,网页搜索一秒就能搜到你想要的【老司机必备神技】
  8. bzero和memset函数
  9. H264视频解码器C++工程说明
  10. 通达信软件里php文件在哪,通达信股票交易软件使用秘籍
  11. Html 页面底部添加版权信息11
  12. linux下xz文件如何解压,tar.xz文件如何解压
  13. 标品与非标品的定义 标品与非标品的区别,以及标品与非标品直通车运营方案
  14. npm install安装失败,报错记录之The operation was rejected by your operating system. node-sass无法安装,且禁用淘宝镜像
  15. Kinect开发(如何连接电脑)
  16. 电子表格多轴图表_如何在Google表格中切换图表轴
  17. PHP GD库文字生成图片及图片拼接
  18. 基于python实现仿探迹和天眼
  19. [源码解析] PyTorch 分布式(2) ----- DataParallel(上)
  20. 试用Unity3D体验(三):添加Loading页面

热门文章

  1. 【应用回归分析】CH3 回归参数的估计6——广义最小二乘估计
  2. Django + mysql + 微信 抢票之本地环境搭建
  3. 立方度量(Cubic Metric)
  4. Flutter APNS device token not set before retrieving FCM Token for Sender ID
  5. 自定义Navigationbar,使用Catagory
  6. BZOJ1050 [HAOI2006]旅行comf(Kruskal算法)
  7. opencv两张图片叠加显示
  8. ubuntu20运行A-LOAM记录
  9. Pathon 连接数据库
  10. 飞线(jump wire)