0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中到底应不应该使用goto语句

Wildesbeast 来源:今日头条 作者:嵌入式大杂烩 2020-01-16 09:12 次阅读

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

一、goto的基本语法

goto语句有两部分:goto和标签名。标签的命名规则与变量的命名规则一样。如:

goto label;

要让这条语句正常工作,函数还必须包含另一条标为label的语句,该语句以标签名后紧跟一个冒号开始,如:

label:printf(“goto here. ”);

二、goto的例子

运行结果:

从运行结果我们明显可以知道goto用法,可以跳出多重循环,程序执行过程中遇到goto语句就可以跳转到label处继续执行。值得注意的一点是:goto语句与其跳转的标签处必须在同一个函数内。

三、goto与break、continue的区别?

同样是跳转语句,goto语句与break、continue语句有什么区别呢?实际上,break和continue是goto的特殊形式。使用break与continue的好处是:其名称已经表明他们的用法。下面通过代码实例看一下break与continue的用法:

1、break测试函数

使用上面的测试程序,建一个测试break语句的函数void TestBreak(void);,如:

运行结果:

从运行结果我们明显可以知道,break可以退出当前循环。在本例子中,第一个break语句退出当前的for循环,第二个break语句退出当前的while循环。可见,一个break可退出一层循环。所以,根据break与goto的特点知道,如果是跳出很多层循环,使用goto会方便些。

2、continue测试函数

同样的,建一个测试continue语句的函数void TestContinue(void);,如:

运行结果:

从运行结果我们明显可以知道,continue可以结束本次循环(而不是整个循环)而进入下一次循环(i所代表的就是循环的次数)。

四、支持与反对goto的理由是什么?

1、不提倡使用goto

不提倡使用goto的占比应该比较多,不提倡的原因主要是:

很容易把逻辑弄乱且难以理解。

2、使用goto的理由

这一部分人认为goto可以用在以下两种情况比较方便:

(1)跳出多层循环。

这个例子就类似于我们上面的goto测试程序。

(2)异常处理。

一个函数的执行过程可能会产生很多种情况异常情况。下面有几种处理方式,以代码为例:

方法一:做出判断后,如果条件出错,直接return。

方法二:先设置一个变量,对变量赋值,只有一个return。

方法三:使用goto语句。

其中,方法三就是很多人都提倡的方式,统一用goto err跳转是最方便且效率最高的,从反汇编语句条数可以看出指令用的最少,消耗的寄存器也最少,效率无疑是最高的。并且,使用goto可以使程序变得更加可扩展。当程序需要在错误处理时释放资源时,统一到goto处理最方便。这也是为什么很多大型项目,开源项目,包括Linux,都会巨量的出现goto来处理错误!

以上就是关于goto语句的基本使用、goto与break、continue的区别的总结

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206730
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128515
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61308
收藏 人收藏

    评论

    相关推荐

    PCB设计表面到底不应该敷铜?

    在pcb设计中,我们经常疑惑pcb的表面应不应该铺铜?这个其实是视情况而定的,首先我们需要了解表面敷铜带来的好处以及坏处。 首先我们先来看表面敷铜的好处 1. 表面铺铜可以对内层信号提供额外的屏蔽
    的头像 发表于 04-15 08:38 257次阅读
    PCB设计表面<b class='flag-5'>到底</b>应<b class='flag-5'>不应该</b>敷铜?

    深入探讨嵌入式C编程的goto语句

    什么是goto语句goto 语句被称为 C 语言中的跳转语句。 用于无条件跳转到
    发表于 01-21 10:41 314次阅读
    深入探讨嵌入式C编程的<b class='flag-5'>goto</b><b class='flag-5'>语句</b>

    ADE7858A裸露焊盘exposed pad不应该接AGND?

    1.ADE7858A裸露焊盘exposed pad不应该接AGND?(英文手册说一定要接AGND,中文手册说不要有任何电气的连接那只是加强机械强度和散热的?) 2.ADE7858A采用的晶振一定
    发表于 12-26 06:50

    弯曲时请小心:为什么不应该利用元件脚端弯曲这个捷径

    弯曲时请小心:为什么不应该利用元件脚端弯曲这个捷径
    的头像 发表于 12-15 16:56 159次阅读
    弯曲时请小心:为什么<b class='flag-5'>不应该</b>利用元件脚端弯曲这个捷径

    AD7656用的内部参考,测得vref A、B、C三点的电压差不多4.8V,不应该是2.5V吗?

    AD7656用的内部参考,我测得vref A、B、C三点的电压差不多4.8V,不应该是2.5V吗?
    发表于 12-01 06:23

    c语言中逻辑真等价于什么

    在C语言中,逻辑真等价于1。逻辑真可以理解为一个表达式、语句或条件的结果为真,即满足条件。在计算机科学和编程中,逻辑真在控制流语句、循环和条件语句中具有重要的作用。 逻辑真等价于条件为
    的头像 发表于 11-30 14:10 777次阅读

    c语言中顺序结构的基本流程

    语句组成,这些语句用于完成特定的任务或操作。在C语言中,每个语句都以分号结束,多个语句可以用大括号括起来形成一个
    的头像 发表于 11-22 10:20 480次阅读

    C语言中如何实现注释

    在C语言中,注释是用来增加代码可读性和注释过程和功能的文本。C语言中支持两种类型的注释:单行注释和多行注释。 单行注释以双斜杠(//)开始,直到该行结束。该注释语句可以在代码的任何位置插入,用于解释
    的头像 发表于 11-22 10:17 635次阅读

    C语言中链表的作用是什么?

    C语言中指针用的很少,链表、文件操作几乎没用过,所以也不能理解到底有什么作用。各位有经常在做程序时会用到这些吗。
    发表于 11-06 06:23

    C语言中数字怎么转成指针?

    C语言中数字怎么转成指针,比如我要去内存地址为0x100的内容,用一句话表达,不如uchar a=?我要问号等于0x100地址的内容
    发表于 10-31 06:29

    C语言中ASCII代码是什么意思?

    C语言中ASCII代码是什么意思常见的ASCII代码都需要记吗
    发表于 10-25 07:10

    C语言中if语句、if-else语句和switch语句详解

    在C语言中,有三种条件判断结构:if语句、if-else语句和switch语句
    发表于 08-18 16:36 1013次阅读
    C<b class='flag-5'>语言中</b>if<b class='flag-5'>语句</b>、if-else<b class='flag-5'>语句</b>和switch<b class='flag-5'>语句</b>详解

    C语言中break语句的语法和基本应用

    在C语言中,break语句是一种控制流语句,它用于终止当前所在的循环结构(for、while、do-while)或者switch语句,从而跳出循环或者结束switch
    发表于 08-17 15:35 1007次阅读

    嵌入式C语言中goto语句详解

    goto语句被称为C语言中的跳转语句。用于无条件跳转到其他标签。它将控制权转移到程序的其他部分。
    发表于 07-19 16:08 1613次阅读
    嵌入式C<b class='flag-5'>语言中</b>的<b class='flag-5'>goto</b><b class='flag-5'>语句</b>详解

    周鸿祎称AI不应该引发大规模裁员

    周鸿祎称AI不应该引发大规模裁员 人工智能的快速发展引发了很多争论,一些论点认为人工智能甚至引发大规模裁员,会替代掉很多的岗位,对此,周鸿祎称AI不应该引发大规模裁员AI更应该是帮助企业和政府的员工
    的头像 发表于 06-26 19:34 1750次阅读