什么是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