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語言、C++和Java中的switch陳述式高效地實現了一個多路goto,跳轉目標由表達式的值來選擇。
參見
參考資料
- ^ 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