1、goto关键字基础知识关键字goto从字面的意思就是"去哪里"的意思,专业一点的话表示无条件跳转的意思(有学过汇编的小伙伴应该会觉得非常像jump指令),在C语言中的使用格式是:goto label,表示跳转到label的位置,并且我们的label一般都写在语句的开头,写成label:的形式。(下面一个小例子来简单介绍用法)

intmain(intargc,char*argv[]){

//无条件跳转到标签处

gotothelastBug;

printf("未知bug\n");

//标签定义

thelastBug:

printf("最后一个bug\n");

return0;

}

注意点:

1)goto label;后面的分号一定得打。(个人经常忘记,这里提醒一下各位)

2)goto只能在函数内部无条件跳转,不能从一个函数跳转到另外一个函数。

3)label:的标识在使用goto语句的前后均可,不遵循先定义后使用。

4)label的作用域在函数内部,不同函数之间可以定义相同的label。

(上面的几点注意项大家有时间可以在电脑上实验下)

2、备受争议的C语言关键字-goto

对于goto的使用程序语言界算是争议不断,并且大部分大学C语言老师在讲到到goto这关键字的时候一般都会叫大家慎用goto关键字,甚至有部分老师一棍子拍死“禁止使用goto关键字”。个人觉得一棍子打死终究不合适,慎用比较说得过去点。如果说禁止使用那为什么还要在C语言标准中定义呢?干脆直接剔除算了。有句话说得好,"存在即合理"。

我们在高中学习算法的时候应该画过基本的结构图,三大基本的程序结构分别是:顺序结构、分支结构和重复结构,这个三种结构就能够创造出所有的逻辑结构,那么我们C语言就是顺序执行的表示顺序结构;if、switch等表示分支结构;while、for等结构表示的是重复结构。可以说我们不用goto语句也能编写出我们想要实现的程序。

那么我们换一种思考方式,我们的重复结构就比如说三个循环语句for、while、do...while,在我的实践编程经验来看他们都可拆成:一个分支语句+goto语句,下面我举一个if+goto实现for语句的例子供大家参考:

/**********************************

* Fucion: main

* Descri: if+goto 模拟for语句

**********************************/

intmain(intargc,char*argv[]){

//循环变量定义

inti=0;

i=0;

Loop:if(i>5){gotoLoopEnd;}i++;

//for(i= 0;i<5;i++)

//{

printf("%d\n",i);

gotoLoop;

//}

LoopEnd:

printf("最后一个bug\n");

return0;

}

其他的重复语句也可以由分支+goto模拟,这里就不再书写代码了,只是说用模拟循环的方式似乎书写上不是很美观。所以我觉得并不是goto不好用,而是怕大家滥用,导致对程序的把控力的下降。

那么我们再深入一点看待goto语句,我上面说了该关键字非常的灵活,其实goto本身的功能是非常简单的,就是一个跳转到所定义的标签label位置,灵活的地方在于label可以在一个函数内部每一句的开头都可以定义。

所以我们要控制goto为我们所用主要就是控制label的使用问题,后面我们会有例子教大家怎么控制label,所以goto语句还是一个非常有潜力的关键字,对于设计巧妙高效的算法会非常有用!所以个人觉得只要对goto语句的使用加以管束为我们开发服务,这未尝不是一件好事。

3、大佬都是这么用goto的!

1)瞄一瞄linux中的goto

我们读过linux相关代码的小伙伴会发现goto语句的使用无处不在,首先我截取了uboot1.1.6中的一部分代码来欣赏一下(毕竟uboot也是大佬写的):

微信å¾ç_20200624095511.png (36.16 KB, 下载次数: 0)

2020-6-24 09:55 上传

微信å¾ç_20200624095515.png (29.15 KB, 下载次数: 1)

2020-6-24 09:55 上传

第一张是一个函数的前半部分,第二张为该函数末尾,中间代码还有非常多这样的语句。程序大体的意思是:打开一个文件,然后对该文件一系列操作,一旦操作不成功就会goto到error标签,然后关掉该文件,否则如果都执行成功了就会return 1.表示成功。

没错,这是goto常用的一种用法就是处理多种异常情况,这样带来的好处是高效,为什么这么说呢?有些小伙伴就就会问题了,我直接在每个错误处理用return返回一个变量,然后再函数外面通过判断这个标志进行故障处理不就好了吗?

个人觉得如果你有这样的想法是好的,不过在我们进行驱动编程的过程中还是要有一定的规范,如上面的代码我们在函数前面申请了mem_fb,既然没有使用成功我们就应该在该函数中直接释放它,这样能够对函数有更好的封装和隐秘性。那有些小伙伴又会说,分支语句每个分支里面进行处理就好了呀,这种处理方式会使得每个分支语句里面都有相同的释放处理语句,加大了程序。

2)使用goto跳出多层循环

我们都知道break仅仅只能跳出当前循环,如果遇到多层循环需要跳出的问题,就需要每个循环都需要break一下,并且还需要内层循环传递相关信号让外层循环break掉,从而退出多层循环,这样做实在有点麻烦,而且代码结构也不好看,那么有些小伙伴就会问那我直接return掉就好了,我们来看一下下面的代码你就会有自己的决定了:

/**********************************

* Fucion: main

* Descri: goto跳出多层循环

**********************************/

intmain(intargc,char*argv[]){

inti=0,j=0,k=0;

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)

{

for(k=0;k<10;k++)

{

//if(条件不满足)

//goto ERROR;

}

//if(条件不满足)

//goto ERROR;

}

//if(条件不满足)

//goto ERROR;

}

return1;

ERROR:

//相关资源释放

printf("最后一个bug\n");

return0;

}

/**********************************

* Fucion: main

* Descri: return跳出多层循环

**********************************/

intmain(intargc,char*argv[]){

inti=0,j=0,k=0;

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)

{

for(k=0;k<10;k++)

{

//if(条件不满足)

//相关资源释放

//return 0;

}

//if(条件不满足)

//相关资源释放

//return 0;

}

//if(条件不满足)

//相关资源释放

//return 0;

}

printf("最后一个bug\n");

return1;

}

3)作者对goto关键字小结

这里仅仅代码个人的使用观点:

(1)上面两个例子中我们使用goto是可以借鉴的,对程序的效率和美观有一定的效果;

(2)对于一般的程序goto语句的功能尽量简单,便于分析和代码的整洁,如果不能带来较大的优势还是尽量少用;

(3)个人平时研究控制理论,对于任何事物觉得要么是发散、要么是收敛比较好分析处理问题,对于震荡问题相对比较麻烦,所以对于如下图2种goto的使用情景我是推荐的,前面说了只要我们控制好goto的灵活度就能够为我们服务,那么我们只需要规定在一个函数中其只是单向跳转,我们对程序的把控能力就大大提高了。

微信å¾ç_20200624095519.png (52.15 KB, 下载次数: 2)

2020-6-24 09:55 上传

4、总结

好了,今天的内容就到这里吧,看完这个文章希望大家能够有点收获吧,也希望大家能帮忙传播传播

goto在c语言中的作用,关键字goto在C语言中的使用相关推荐

  1. 充分利用计算机在教学中的作用,浅谈多媒体在教学中的作用

    浅谈多媒体在教学中的作用 时间:2018-04-14 来源:未知 作者:admin 点击:次 核心提示:浅谈多媒体在小学数学教学中的作用 摘要 在数学课堂中合理运用多媒体技术能充分调动学生的学习积极, ...

  2. C语言的广泛作用的论文,高职C语言课程教学论文

    高职C语言课程教学论文 时间: 2014-04-23 栏目: 高职C语言课程教学论文 提高高职C语言课程教学效果的研究与实践 文/杨晓明 刘淑婷 摘 要:C语言是高职院校学生接触的第一门计算机语言课, ...

  3. 计算机技术在建模中的作用,谈计算机在数学建模中的作用

    2 0 1 3年第 9期 (总第 1 3 1期) 信息通信 I NFORM AT1 0N& COMM UNI CAT I ON S 2Ol 3 ( S u m .N o l 3 1 ) 谈计算 ...

  4. html中scr作用,车用尿素在SCR系统中的作用讲解?

    车用尿素在SCR系统中的作用讲解? 添加时间:2018-12-12  录入:本站  来源:原创 车用尿素作为重型柴油车实现国四排放至关重要的一环,其作用是为了减少氮氧化合物排放.了解一下车用尿素在SC ...

  5. C语言的广泛作用的论文,关于c语言论文模板

    该频道包含关于c语言论文模板和c语言的范例,免费为你学习关于c语言的论文提供相关参考文献资料. 摘要:在一套试卷中,重复题问题是影响考试质量的一个重要因素.该文针對C语言试卷中选择题间易出现重复题问题 ...

  6. python在平面设计中的作用_图形创意在平面设计中的作用分析

    龙源期刊网 http://www.qikan.com.cn 图形创意在平面设计中的作用分析 作者:张 雷 王志芬

  7. c语言线索二叉树作用,线索二叉树(C语言)

    实现下面这棵树: 先序遍历: A B C D E F 中序遍历: C B D A E F 代码 #include #include #include #include typedef enum {li ...

  8. main在c语言中的作用,main函数在C语言中是怎么定义的?有什么作用?

    main函数在C语言中是怎么定义的?有什么作用? 更新时间:2019-10-24 13:55 最满意答案 额,main不是程序的最开始啦.拿用glibc的程序来说,C语言执行的过程应该是 _start ...

  9. c语言子函数作用是什么意思,C语言编译器中常见的函数用法以及作用详解

    C语言的编译器中自带很多库函数,如果熟悉了,用起来操作起来都很方便,不仅能提高效率稳定性也是毋庸置疑的,毕竟都是世界级的大师写出来的.今天就来谈一谈,C语言自带的函数内存操作处理这一块 主要有:mem ...

最新文章

  1. MIPS(loongson)linux 中添加系统调用
  2. 桶排序python实现
  3. Windows下visual studio code搭建golang开发环境
  4. 多项式乘法运算初级版
  5. LiveVideoStackCon讲师热身分享第一季
  6. matlab 传感器的迟滞,MATLAB PI迟滞模型问题
  7. yolov3安卓实现_YOLOv3 的 TensorFlow 实现,GitHub 完整源码解析
  8. Android官方开发文档Training系列课程中文版:布局性能优化之布局复用
  9. javascript历史、作用、三大组成、javascript代码书写位置、注意事项、变量
  10. “3D几何与视觉技术”全球在线研讨会第九期~识别3D中的物体和场景
  11. R7-7 寻找大富翁 (25 分)
  12. cocos2d-x之猜数字游戏
  13. 总结java IDE (eclipse)快捷键
  14. 缅怀三年——炫丽的新加坡(下)
  15. 单片机电子时钟设计(期末课程设计)
  16. 机器智能-高频问题:一阶逻辑转化合取范式
  17. windows 系统 工具栏 快速启动
  18. zookeeper的脑裂问题
  19. 《公共管理学》考试重点及答案
  20. 华南师范大学计算机学院图论,葛文秀 - 华南师范大学 - 数学科学学院

热门文章

  1. Mysql基础--常见的表的约束介绍(一)
  2. php 多维素组添加下级,php中如何将元素添加到多维数组
  3. flutter刷新页面_Flutter BottomNavigationBar切换会刷新当前页面解决方
  4. 一道问题引出的python中可变数据类型与不可变数据类型
  5. Python用HTMLTestRunner生成html测试报告
  6. 深度学习网络backbone?head、neck、bottleneck、GAP、Embedding、pretext task、downstream task、temperature parameter
  7. nginx报错:nginx: [alert] could not open error log file: open() “/var/log/nginx/error.log“ failed (2: N
  8. 各家版本控制系统(VCS)对比:VSS、SVN、Git。代码托管平台对比:GitLab、GitHub、码云(Gitee)、SourceForge、DevCloud(华为软件开发云)
  9. 机器学习中为啥要有验证集?只要训练集和测试集不就可以了吗?
  10. Python 中的基础语句