当前位置:首页 > 娱乐星闻

goto 为什么在C语言中,goto这么不受待见?

什么是goto语句

Goto语句在C语言中称为跳转语句。用于无条件跳转到其他标签。它将控制权转移给程序的其他部分。

Goto语句很少使用,因为它使程序的可读性和复杂性变差。

语法

转到标签;

Goto语句示例

让我们看一个简单的例子来演示如何在C语言中使用goto语句。

打开Visual Studio创建一个名为:goto的项目,并创建一个源文件:goto-statement . c在这个项目中,代码如下-

#include <。stdio.h>。void main { int age

你没有资格投票);

printf("输入你的年龄:");scanf("%d ",& amp年龄);if(年龄& lt18){ goto goto label;}else {printf("您有资格投票!");}

}

执行上述代码,并获得以下结果

你没有资格投票!输入您的年龄:12您没有资格投票!输入您的年龄:18岁您有资格投票!

为什么这么冷门?

二十年前,计算机编程还处于起步阶段,程序流程是由“GOTO”语句控制的。这种语句允许程序员中断当前代码行,直接转到另一个不同的代码段。清单1是一个简单的例子。

带功能的控制流

维基百科的解释是GOTO语句一直是批评和争论的对象,主要的负面影响是使用GOTO语句使程序可读性变差,甚至成为可维护的“面条代码”。从20世纪60年代到70年代,随着结构化编程变得越来越流行,许多计算机科学家得出结论,程序应该总是使用被称为“结构化”控制流的命令,例如循环和if-then-else语句,而不是GOTO。

甚至在今天,许多编程风格的编码标准都禁止使用GOTO语句。GOTO语句的捍卫者认为GOTO语句的有限使用不会导致低质量的代码,并声称在很多编程语言中,有些任务不使用一个或多个GOTO语句是无法直接实现的。比如有限状态自动机的实现,跳出嵌套循环,异常处理。

对后藤最著名的批评可能是艾兹格·迪科斯彻在1968年发表的一篇题为“后藤声明的有害理论”的论文。[2] Dijiestra认为GOTO语句的无限制使用应该从高级语言中废除,因为它使分析和验证程序正确性的任务变得复杂(特别是涉及循环)。

另一个观点出现在高德纳的结构化编程与GOTO语句[3]。本文分析了许多常见的编程任务,然后发现其中一些会通过使用Goto得到最理想的结构。

这些批评在一些编程语言的设计中发挥了作用。虽然Ada的设计者在20世纪70年代末就意识到了goto的批评,但是这个语句还是被包括在内,主要是为了支持GOTO语句必要代码的自动生成。

[4]但是,作为goto语句目的地的标签必须用双尖括号括起来(例如,

此外,还有许多不同的语言形式可以视为goto的变形:

受限GOTO

很多语言,比如C语言和Java,都提供了相关的控制流语句,比如break和continue,这些都是有效受限的goto语句。它们的功能是无条件跳转,但它们只能跳转到循环块的末尾——继续下一个循环或结束循环(中断)

开关/外壳结构

C语言、C++和Java中的switch语句高效地实现了多通道goto,跳转目标由表达式的值来选择。

这也导致我们没有理由使用goto。

鉴于这些,goto的当前用法如下:

goto语句的结果:goto语句在C/C++等高级编程语言中保留,但建议不要使用或少用。在一些较新的高级编程语言中,如Java,不提供goto语句。虽然指定goto为关键字,但不支持其使用,使得程序简洁易读;但是后来的c#还是支持goto语句。goto语句的一个优点是可以保证程序有唯一的出口,避免嵌套过大。

另一方面,goto语句不是提倡的,但肯定不是禁用的。那么在什么情况下可以使用goto语句呢?

考虑使用goto:

直接跳出多个循环;

出现错误时清除资源;

可以提高节目清晰度的环境。

无限制使用goto破坏了清晰的程序结构,使程序可读性变差,甚至成为可维护的“面条代码”。经常会带来错误或者隐患,比如可能会跳过对象的构造、变量的初始化、重要的计算等一些语句。

以下关于使用goto语句的原则可供读者参考。

1)使用goto语句只能转到同一个函数,而不能从一个函数转到另一个函数。

2)在同一个函数中使用goto时,goto的起点应该是函数中一个小函数的结束,goto的目的标签应该是函数中另一个小函数的开始。

3)在复杂的执行状态下不允许从goto到另一个位置,比如不允许从多个嵌套循环判断中跳出。

4)应避免双向跳跃。这最有可能导致“面条码”。

读过linux内核代码的同学应该注意到,在linux内核代码中很多地方实际上都使用了goto语句,但是你会发现它的使用非常谨慎,基本遵循了上面的原则。

﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

声明:内容是从互联网上组织的,版权归原作者所有。如果涉及到作品的版权问题,请及时联系我们,谢谢!

你和丹尼尔工程师有什么区别?

加入技术交流小组,与专家面对面交流

向组中添加爱好者助手

1.《goto 为什么在C语言中,goto这么不受待见?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《goto 为什么在C语言中,goto这么不受待见?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/1221792.html

上一篇

曾经沧海难为水的出处

下一篇

元稹的妻子是谁

酷站欣赏 酷站欣赏、酷站模板、酷站代码

or函数 Excel逻辑函数and,or和乘号,加号的应用

  • or函数 Excel逻辑函数and,or和乘号,加号的应用
  • or函数 Excel逻辑函数and,or和乘号,加号的应用
  • or函数 Excel逻辑函数and,or和乘号,加号的应用

excel加号 Excel逻辑函数and,or和乘号,加号的应用

  • excel加号 Excel逻辑函数and,or和乘号,加号的应用
  • excel加号 Excel逻辑函数and,or和乘号,加号的应用
  • excel加号 Excel逻辑函数and,or和乘号,加号的应用

967 成员风采|首届主任委员单位——盈峰环境科技集团股份有限公司 国内领先的高端装备+环境综合服务商(股票代码:000967)

  • 967 成员风采|首届主任委员单位——盈峰环境科技集团股份有限公司 国内领先的高端装备+环境综合服务商(股票代码:000967)
  • 967 成员风采|首届主任委员单位——盈峰环境科技集团股份有限公司 国内领先的高端装备+环境综合服务商(股票代码:000967)
  • 967 成员风采|首届主任委员单位——盈峰环境科技集团股份有限公司 国内领先的高端装备+环境综合服务商(股票代码:000967)

盈峰环境股票 成员风采|首届主任委员单位——盈峰环境科技集团股份有限公司 国内领先的高端装备+环境综合服务商(股票代码:000967)

  • 盈峰环境股票 成员风采|首届主任委员单位——盈峰环境科技集团股份有限公司 国内领先的高端装备+环境综合服务商(股票代码:000967)
  • 盈峰环境股票 成员风采|首届主任委员单位——盈峰环境科技集团股份有限公司 国内领先的高端装备+环境综合服务商(股票代码:000967)
  • 盈峰环境股票 成员风采|首届主任委员单位——盈峰环境科技集团股份有限公司 国内领先的高端装备+环境综合服务商(股票代码:000967)
goahead GoAhead远程代码执行漏洞分析报告

goahead GoAhead远程代码执行漏洞分析报告

0x01简介 CVE-2017-17562是一个基于继续前进的网络服务器 造成该漏洞的原因是GoAhead允许用户通过参数构造任意环境变量,这会影响所有启用了动态链接的CGI可执行文件。当CGI程序调用glibc动态链接库时,像LD _ PRE...

即速应用 老柳树告诉你,小程序之即速应用怎么收费?

  • 即速应用 老柳树告诉你,小程序之即速应用怎么收费?
  • 即速应用 老柳树告诉你,小程序之即速应用怎么收费?
  • 即速应用 老柳树告诉你,小程序之即速应用怎么收费?
github进不去 今天的代码提交不上?不是你的问题,GitHub挂了

github进不去 今天的代码提交不上?不是你的问题,GitHub挂了

                ...