Goto

✍ dations ◷ 2025-09-13 08:28:15 #Goto

GOTO是一条可以在许多计算机编程语言中找到的语句。它是英文单词和的组合。当执行这条语句的时候,它将控制流程无条件地转到另一条语句(也叫“跳转”)。跳转语句需要指明标记,在不同语言中,标记可以是标识符或行号。在机器码级别,goto是一种分支的形式。

在一些语言中,可以不用显示地使用goto关键字而实现同样的功能,例如breakcontinue关键字可以跟随一个标识符。SNOBOL语言支持一种语句的后缀形式,可以在本条语句执行完毕后实现无条件跳转。

GOTO语句被大部分高级语言支持,只有很少的高级语言不支持GOTO语句。例如,goto是一个Java语言的保留字,但是不允许使用。

goto语句通常和IF语句一起使用来实现一个条件跳转。

   IF  THEN goto ;

编程语言一般对goto语句跳转的位置加以严格限制。例如,在C中,不允许跳转至另一个函数中的标记位置。Setjmp函数提供了对非本地goto的支持。

以下C++例子中,我们要在二维数组ar中找寻有没有100这个数。如果找到,要立即停止搜索,节省时间。

for (int i=0; i<n; i++)    for (int j=0; j<m; j++)        if (ar==100)goto found;...found:...

如果使用break只能跳出目前所在的一个for循环,因此需要使用goto跳出所有循环。

GOTO语句一直是批评和争论的目标,主要的负面影响是使用GOTO语句使程序的可读性变差,甚至成为不可维护的“面条代码”。随着结构化编程在二十世纪六十年代到七十年代变得越来越流行,许多计算机科学家得出结论,即程序应当总是使用被称为“结构化”控制流程的命令,如循环以及if-then-else语句来替代GOTO。甚至在今天,许多程序风格编码标准禁止使用GOTO语句。为GOTO语句辩护的人认为,加以限制地使用GOTO语句不会导致低质量的代码,并且声称在许多编程语言中,一些任务如果不使用一条或多条GOTO语句是无法被直接实现的。如有限状态自动机的实现、跳出嵌套循环以及异常处理。

大概最著名的对于GOTO的批评是艾兹格·迪杰斯特拉在1968年的一篇名称为《GOTO语句有害论》的论文。迪杰斯特拉认为不加限制地使用GOTO语句应当从高级语言中废止,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。另外一种观点出现在高德纳的 中,文章分析了许多常见编程任务,然后发现其中的一些使用GOTO将得到最理想的结构。

这些批评在一些编程语言的设计上起到了效果。虽然Ada语言的设计者在二十世纪七十年代晚期意识到了对于GOTO的批评,这条语句仍旧被包含进去,主要是用来支持自动生成那些goto语句必不可少的代码。但是,作为goto语句目的地的标签必须使用双尖括号括起来(如:<<Start_Again>>),而这个语法在其他语言中都不被使用。这使得检查程序中goto目的地的存在变得容易。goto语句本身使用简单的形式goto Start_Again;.

有许多不同的语言构成可以看作是的变形:

许多语言,如C语言和Java,提供了相关的控制流语句,如breakcontinue,它们都是有效地被限制的goto语句。它们的作用是无条件跳转,但是只能够跳到循环块结束的位置——继续进入下一循环(continue)或者结束循环(break)。对于break语句,部分语言允许附加特定参数来控制结束循环的范围,例如PHP允许标记数字参数代表跳出嵌套语句的层数,Java允许例如在语句块开始前添加<标签名>:,在语句块内以标签名作为参数代表跳转到该循环语句的结束位置。

对于Java而言,虽然goto是作为保留字,但没有赋予其功能,从而限制goto的使用。

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

相关

  • 农业社会农业社会为以农业为经济主导的社会。当人类的农业活动达一定规模,便渐渐进入农业社会,工业总产值与农业总产值,是一般区分农业社会及工业社会的方法。然而,农业社会中人与自然之
  • 角膜后沉积物角膜后沉积物(keratic precipitate),在角膜内表面的点状沉积物,可以通过裂隙灯看到。KP的出现有两个必要条件:也就是说,KP的出现前提是有眼内炎症的发生。正常的眼睛或者只有外
  • CKEditorCKEditor,旧称FCKeditor,是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器。它志于轻量化,不需要太复杂的安装步骤即可使用。它可和PHP、JavaScript、ASP、ASP.NET
  • 群英夺宝《群英夺宝》(英语:)是一部1934年的美国犯罪电影,由罗伯特·弗洛里(英语:Robert Florey)执导。
  • 约旦超级杯约旦超级杯(Jordan Super Cup)是约旦国内一项足球杯赛赛事,于1981年创办,约旦足球协会主办赛事,每年由约旦超级足球联赛冠军与约旦足总杯盟主之间角逐。阿尔费萨里为夺冠次数最多
  • 中国远洋海运集团中国远洋海运集团有限公司(英语:China COSCO Shipping Corporation Limited),简称中国远洋海运集团、中国远洋海运,属于中央管理的特大型国有企业,由国务院国有资产监督管理委员会
  • 朴炳善朴炳善 (韩语:박병선,1928年-2011年11月22日),法籍韩裔历史学家,1972年于法国国家图书馆最早发现了世界最古老的金属活字本《直指心体要节》的存在,并对法国国立图书馆所收藏的《外
  • 八月三十一日,我在奥斯陆《八月三十一日,我在奥斯陆》 (挪威语:Oslo, 31. august)是2011年由挪威导演尤沃金·提尔所执导的电影作品,松散地改编自皮耶·缀厄·拉·侯歇(英语:Pierre Drieu La Rochelle)的小
  • 石田顺子石田顺子,日本足球运动员,日本国家女子足球队成员。在1981年6月7日,她代表日本国家女子足球队出赛,在对战中华台北的比赛中首次​​亮相。1981年,他共为国家足球队出场3次。她也曾代表日本参加1981年亚足联女子亚洲杯。
  • 班达 (神话)班达(英语:Bandua)古罗马凯尔特神话女性神祇之一。长期于今伊比利亚半岛地区的葡萄牙等国家发挥相关作用并得到崇拜与传播,具有重要地影响与积极意义。