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

    文章

    11310

    浏览量

    209616
  • C语言
    +关注

    关注

    180

    文章

    7605

    浏览量

    136932
  • 函数
    +关注

    关注

    3

    文章

    4332

    浏览量

    62666
收藏 人收藏

    评论

    相关推荐

    AMC1305正常方波信号频率周期不应该为20MHz,保持不变吗?

    ,最后换算成电流。这样的话,那AMC1305输出的方波信号的频率应该是保持不变的,为20MHz。但是手册上画的这个示意图该怎么理解?显示的是随着差分输入电压的变化,不仅是占空比发生了变化,方波信号周期也发生了变化;正常方波信号频率周期不应该为20MHz,保持不变吗? 麻烦
    发表于 12-23 06:04

    深入理解C语言:循环语句的应用与优化技巧

    在程序设计中,我们常常需要重复执行某一段代码。为了提高效率和简化代码,循环语句应运而生。C语言作为一门经典的编程语言,提供了多种循环控制结构,帮助程序员高效地实现重复操作。掌握循环
    的头像 发表于 12-07 01:11 168次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:循环<b class='flag-5'>语句</b>的应用与优化技巧

    使用ADS1120将输入短接到(AVDD+AVSS)/2时,采样输出是1333的值,采样值不应该是0吗?

    使用ADS1120将输入短接到(AVDD+AVSS)/2时,采样输出是1333的值,采样值不应该是0吗?
    发表于 12-05 08:19

    C语言中申请的堆内存能不能自动释放

    C语言中申请的堆内存能不能自动释放?每次都要手动 free 太麻烦,也容易忘记。 学过 C++ 的同学,应该首先能想到智能指针。 但是这是C
    的头像 发表于 11-27 09:33 121次阅读

    ADS1248的IEXC1/IEXC2 是恒流源,不应该不随负载变化而变化吗?

    左右。(J6/J9短接,J8 NC) ADS1248的IEXC1/IEXC2 是恒流源,不应该不随负载变化而变化吗? ps:不接负载的话,IEXC1 /IEXC2的输出和设置值一样,1mA, VREF 1.62V。 图1. 图2.
    发表于 11-27 06:33

    威廉希尔官方网站 干货驿站 ▏深入理解C语言:掌握C语言条件判断,从if到switch的应用

    在编程中,条件判断语句是控制程序流程的核心元素之一。它们使得程序能够根据不同的输入和状态,做出相应的决策。特别是在C语言中,条件判断语句的使用极为广泛,涵盖了从简单的if
    的头像 发表于 11-09 01:10 343次阅读
    威廉希尔官方网站
干货驿站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:掌握<b class='flag-5'>C</b><b class='flag-5'>语言</b>条件判断,从if到switch的应用

    C语言中的socket编程基础

    Socket编程简介 Socket是一种通信机制,允许程序之间进行通信。在C语言中,socket编程是网络编程的基础。通过使用socket,程序可以发送和接收数据,实现不同计算机之间的通信
    的头像 发表于 11-01 16:51 337次阅读

    c语言中从左到右结合怎么看

    C语言中,操作符的结合性(Associativity)是指当操作符在表达式中连续出现时,它们如何与操作数结合的顺序。对于大多数二元操作符(即需要两个操作数的操作符),C语言遵循两种基
    的头像 发表于 08-20 11:42 903次阅读

    在5bitfifo程序中,输出一次数据后flaga自动拉高,此时flaga不应该处于拉低状态吗?

    您好,在5bitfifo程序中,使用端点0x01-0x81,0x01输入数据正常,epswitch切换也正常,0x81输出数据是正确的,但是输出一次数据后flaga自动拉高,此时flaga不应该处于拉低状态吗,这是什么原因引起的,麻烦给一些建议
    发表于 07-02 07:33

    使用stm32f0的STOP模式,通过WFE进入STOP后,被GPIO的INT唤醒了,不应该是被GPIO的EVENT唤醒吗?

    大家好, 最近使用F0的STOP模式遇到一个问题,在通过WFE进入STOP后,被GPIO的INT唤醒了,不应该是被GPIO的EVENT唤醒吗?? 大家有没有同样的问题。。
    发表于 05-11 07:10

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

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

    为什么STM32L4P5G-DK用USB线连接PC LD4灯亮红了,不应该是LD5亮绿吗?

    为什么STM32L4P5G-DK这个板子用USB线连接PCLD4灯亮红了,不应该是LD5亮绿么?是板子烧了么?
    发表于 03-19 07:36

    介绍C语言中错误处理和异常处理的一些常用的方法和策略

    C语言是一种低级的、静态的、结构化的编程语言,它没有提供像C++或Java等高级语言中的异常处理机制,例如try-catch-finally
    的头像 发表于 02-28 14:25 631次阅读

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

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

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  在C语言中,访问权限冲突异常通
    的头像 发表于 01-12 16:03 5768次阅读