C语言中的goto语句该不该使用?

内容分享1周前发布
0 23 0

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

一、goto的基本语法

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

goto label;

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

label:printf(“goto here.
“);

二、goto的例子

C语言中的goto语句该不该使用?

运行结果:

C语言中的goto语句该不该使用?

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

三、goto与break、continue的区别?

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

1、break测试函数

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

C语言中的goto语句该不该使用?

运行结果:

C语言中的goto语句该不该使用?

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

2、continue测试函数

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

C语言中的goto语句该不该使用?

运行结果:

C语言中的goto语句该不该使用?

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

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

1、不提倡使用goto

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

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

2、使用goto的理由

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

(1)跳出多层循环。

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

(2)异常处理。

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

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

C语言中的goto语句该不该使用?

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

C语言中的goto语句该不该使用?

方法三:使用goto语句。

C语言中的goto语句该不该使用?

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

以上就是关于goto语句的基本使用、goto与break、continue的区别的总结,如有错误,欢迎指出!

© 版权声明

相关文章

23 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    守望孩子的傻妈 投稿者

    goto好用的很啊,特别是需要统一释放资源,逻辑结构也清晰,不然处理更麻烦了,linux内核里到处都是这样的代码

    无记录
  • 头像
    温暖的 读者

    一直在用!

    无记录
  • 头像
    亚博电竞体育 读者

    goto用得不好会把逻辑弄乱,但是一般用在异常处理真的好用!说实话,这些东西没有好不好,只有用的人用得好不好!

    无记录
  • 头像
    金典商标转让网 读者

    说得在理

    无记录
  • 头像
    小甜糕羊 投稿者

    教科书上都不推荐用

    无记录
  • 头像
    羊又走丢了 投稿者

    必须要用char *a=malloc(10);if(!a) goto OUT;char *b=malloc(10);if(!b) goto OUT;OUT:if(a) free(a);if(b) free(b);不用goto很容易漏掉free内存泄漏。

    无记录
  • 头像
    丛林果酱 读者

    坚决不用

    无记录
  • 头像
    广丰漫瑜伽普拉提 投稿者

    哈哈

    无记录
  • 头像
    Yi月31曰 投稿者

    我是新手

    无记录
  • 头像
    破晓 读者

    难道不加while这程序不运行吗

    无记录
  • 头像
    清秋鹤不归_ 投稿者

    这么好的东西怎么能够不用呢?

    无记录
  • 头像
    喵喵苗崽儿 投稿者

    是呀

    无记录
  • 头像
    雨农 读者

    不用

    无记录
  • 头像
    季小黑 读者

    goto 算是保留汇编的一部分能力了吧,挺好用的,我现在动不动就想用。也很好理解。

    无记录
  • 头像
    全太阳系我最萌 投稿者

    内核里面大把的goto

    无记录
  • 头像
    汉德欧 读者

    是啊 很多开源软件也用得很多

    无记录
  • 头像
    文哥 读者

    合理使用,拿不准的时候别用

    无记录
  • 头像
    頑張 读者

    就是这样

    无记录
  • 头像
    读者

    只用goto做异常处理,很好用

    无记录
  • 头像
    夏狐舞 投稿者

    和jmp一样的,用不用看需要,没有混乱逻辑这说法。

    无记录
  • 头像
    手工皂 读者

    循环嵌套条件判断,尤其是switch 时用goto 好,break一多,看得头皮发麻

    无记录
  • 头像
    爱睡觉的梓豪 读者

    用呀,我们公司板子的tcp的socket连接代码中就用到了goto来跳转重新创建和连接,一些书籍中真的是误导什么用goto不好等,只要逻辑理顺了,用着贼舒服

    无记录
  • 头像
    正儿八经搞学习A 读者

    收藏了,感谢分享

    无记录