goto
GOTO是一條可以在許多電腦程式語言中找到的語句。它是英文單詞go和to的組合。當執行這條語句的時候,它將控制流程無條件地轉到另一條語句(也叫「跳轉」)。跳轉語句需要指明標記,在不同語言中,標記可以是識別碼或行號。在機器碼級別,goto是一種分支的形式。
在一些語言中,可以不用顯示地使用goto關鍵字而實現同樣的功能,例如break或continue關鍵字可以跟隨一個識別碼。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,提供了相關的控制流語句,如break和continue,它們都是有效地被限制的goto語句。它們的作用是無條件跳轉,但是只能夠跳到迴圈塊結束的位置——繼續進入下一迴圈(continue)或者結束迴圈(break)。對於break語句,部分語言允許附加特定參數來控制結束迴圈的範圍,例如PHP允許標記數字參數代表跳出巢狀語句的層數[5];Java允許在語句塊開始前添加<标签名>:
,在語句塊內以標籤名作為參數代表跳轉到該語句塊的結束位置,continue語句同樣支援這樣的標籤跳轉,用於跳轉到標籤所標註的迴圈語句的迴圈體語句塊的起始。
對於Java而言,雖然goto是作為保留字,但沒有賦予其功能,從而限制goto的使用。
switch/case結構
參見
參考資料
- ^ 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. 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