Goto

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

在一些语言中，可以不用显示地使用goto关键字而实现同样的功能，例如break或continue关键字可以跟随一个标识符。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[i][j]==100)goto found;
...

found:
...

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

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

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

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

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

 限制的GOTO 
許多語言，如C語言和Java，提供了相關的控制流语句，如break和continue，它們都是有效地被限制的goto語句。它們的作用是無條件跳轉，但是只能夠跳到迴圈塊結束的位置——繼續進入下一迴圈（continue）或者結束迴圈（break）。對於break語句，部分語言允許附加特定參數來控制結束迴圈的範圍，例如PHP允許標記數字參數代表跳出嵌套語句的層數；Java允許在語句块開始前添加<标签名>:，在語句块內以標籤名作為參數代表跳轉到該語句块的結束位置，continue语句同样支持这样的标签跳转，用于跳转到标签所标注的循环语句的循环体语句块的起始。

對於Java而言，雖然goto是作為保留字，但沒有賦予其功能，從而限制goto的使用。

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

 参见 
 非结构化编程
 控制流
 GOSUB
 三次法則
组合子逻辑
柯里化
λ演算
极小化求值
求值策略

 参考資料 

 外部链接 
 A Structured Discipline of Programming
 Using gotos . Summarized arguments agains and pro usage of goto

Category:BASIC程序设计语言家族
Category:控制流程