fbpx
维基百科

goto

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

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

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

用法 编辑

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

 IF 条件 THEN goto 标签; 

编程语言一般对goto语句跳转的位置加以严格限制。例如,在C中,不允许跳转至另一个函数中的標記位置。[1]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语句有害論》的論文。[2]迪杰斯特拉认为不加限制地使用GOTO语句应当从高级语言中废止,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。另外一种观点出现在高德纳Structured Programming with go to Statements [3]中,文章分析了许多常见编程任务,然后发现其中的一些使用GOTO将得到最理想的结构。

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

变体 编辑

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

限制的GOTO 编辑

許多語言,如C語言Java,提供了相關的控制流语句,如breakcontinue,它們都是有效地被限制的goto語句。它們的作用是無條件跳轉,但是只能夠跳到迴圈塊結束的位置——繼續進入下一迴圈(continue)或者結束迴圈(break)。對於break語句,部分語言允許附加特定參數來控制結束迴圈的範圍,例如PHP允許標記數字參數代表跳出嵌套語句的層數,[5]Java允許例如在語句块開始前添加<标签名>:,在語句块內以標籤名作為參數代表跳轉到該迴圈語句的結束位置。

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

switch/case结构 编辑

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

参见 编辑

参考資料 编辑

  1. ^ . [2009-05-16]. (原始内容存档于2007-12-24). 
  2. ^ Edsger Dijkstra. Go To Statement Considered Harmful. Communications of the ACM. March 1968, 11 (3): 147–148. doi:10.1145/362929.362947. 
  3. ^ Donald Knuth. (PDF). Computing Surveys. 1974, 6 (4): 261–301 [2009-05-16]. doi:10.1145/356635.356640. (原始内容 (PDF)存档于2009-08-24). 
  4. ^ John Barnes英语John Barnes (computer scientist). Programming in Ada 2005. Addison Wesley. 2006-06-30: 114–115. ISBN 0-32-134078-7. 
  5. ^ PHP: break - Manual. www.php.net. [2018-09-14]. (原始内容于2021-01-28) (英语). 

外部链接 编辑

  • Using gotos (页面存档备份,存于互联网档案馆). Summarized arguments agains and pro usage of goto

goto, goto是一条可以在许多计算机编程语言中找到的语句, 它是英文单词go和to的组合, 当执行这条语句的时候, 它将控制流程无条件地转到另一条语句, 也叫, 跳转, 跳转语句需要指明標記, 在不同语言中, 標記可以是标识符或行号, 在机器码级别, 是一种分支的形式, 在一些语言中, 可以不用显示地使用关键字而实现同样的功能, 例如break或continue关键字可以跟随一个标识符, snobol语言支持一种语句的后缀形式, 可以在本条语句执行完毕后实现无条件跳转, goto语句被大部分高级语言支持, 只. GOTO是一条可以在许多计算机编程语言中找到的语句 它是英文单词go和to的组合 当执行这条语句的时候 它将控制流程无条件地转到另一条语句 也叫 跳转 跳转语句需要指明標記 在不同语言中 標記可以是标识符或行号 在机器码级别 goto是一种分支的形式 在一些语言中 可以不用显示地使用goto关键字而实现同样的功能 例如break或continue关键字可以跟随一个标识符 SNOBOL语言支持一种语句的后缀形式 可以在本条语句执行完毕后实现无条件跳转 GOTO语句被大部分高级语言支持 只有很少的高级语言不支持GOTO语句 例如 goto是一个Java语言的保留字 但是不允许使用 目录 1 用法 1 1 例子 2 对于goto使用的批评 3 变体 3 1 限制的GOTO 3 2 switch case结构 4 参见 5 参考資料 6 外部链接用法 编辑goto语句通常和IF语句一起使用来实现一个条件跳转 IF 条件 THEN goto 标签 编程语言一般对goto语句跳转的位置加以严格限制 例如 在C中 不允许跳转至另一个函数中的標記位置 1 Setjmp函数提供了对非本地goto的支持 例子 编辑 以下C 例子中 我們要在二維陣列ar中找尋有沒有100這個數 如果找到 要立即停止搜尋 節省時間 for int i 0 i lt n i for int j 0 j lt 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语句有害論 的論文 2 迪杰斯特拉认为不加限制地使用GOTO语句应当从高级语言中废止 因为它使分析和验证程序正确性 特别是涉及循环 的任务变得复杂 另外一种观点出现在高德纳的Structured Programming with go to Statements 3 中 文章分析了许多常见编程任务 然后发现其中的一些使用GOTO将得到最理想的结构 这些批评在一些编程语言的设计上起到了效果 虽然Ada语言的设计者在二十世纪七十年代晚期意识到了对于GOTO的批评 这条语句仍旧被包含进去 主要是用来支持自动生成那些goto语句必不可少的代码 4 但是 作为goto语句目的地的标签必须使用双尖括号括起来 如 lt lt Start Again gt gt 而这个语法在其他语言中都不被使用 这使得检查程序中goto目的地的存在变得容易 goto语句本身使用简单的形式goto Start Again 变体 编辑有许多不同的语言构成可以看作是goto的变形 限制的GOTO 编辑 許多語言 如C語言和Java 提供了相關的控制流语句 如break和continue 它們都是有效地被限制的goto語句 它們的作用是無條件跳轉 但是只能夠跳到迴圈塊結束的位置 繼續進入下一迴圈 continue 或者結束迴圈 break 對於break語句 部分語言允許附加特定參數來控制結束迴圈的範圍 例如PHP允許標記數字參數代表跳出嵌套語句的層數 5 Java允許例如在語句块開始前添加 lt 标签名 gt 在語句块內以標籤名作為參數代表跳轉到該迴圈語句的結束位置 對於Java而言 雖然goto是作為保留字 但沒有賦予其功能 從而限制goto的使用 switch case结构 编辑 C语言 C 和Java中的switch语句高效地实现了一个多路goto 跳转目标由表达式的值来选择 参见 编辑非结构化编程 控制流 GOSUB 三次法則 组合子逻辑 柯里化 l演算 极小化求值 求值策略参考資料 编辑 C Standard section 6 8 6 1 The goto statement 2009 05 16 原始内容存档于2007 12 24 Edsger Dijkstra Go To Statement Considered Harmful Communications of the ACM March 1968 11 3 147 148 doi 10 1145 362929 362947 Donald Knuth Structured Programming with go to Statements PDF Computing Surveys 1974 6 4 261 301 2009 05 16 doi 10 1145 356635 356640 原始内容 PDF 存档于2009 08 24 John Barnes 英语 John Barnes computer scientist Programming in Ada 2005 Addison Wesley 2006 06 30 114 115 ISBN 0 32 134078 7 PHP break Manual www php net 2018 09 14 原始内容存档于2021 01 28 英语 外部链接 编辑A Structured Discipline of Programming Using gotos 页面存档备份 存于互联网档案馆 Summarized arguments agains and pro usage of goto 取自 https zh wikipedia org w index php title Goto amp oldid 75643871, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。