Goto
GOTO是一條會當佇濟濟電腦當語言內底揣著的語句。伊是英文單詞 _ go _ 和 _ to _ 的組合。做執行這條語句的時,伊共控制流程無條件地踅到另外一條語句(嘛叫「跳轉」)。 跳轉語句需要指明標記,佇無仝款的語言內底,標記會當是識別碼抑是行號。佇咧機器碼級別,goto 是一種分支的形式。
佇一寡語言內底,會當毋免顯示地使用 goto 關鍵字而實現仝款的功能,比如講 break 抑是 continue 關鍵字會當綴一个識別碼。SNOBOL 語言支援一種語句的字尾形式,會當佇本條語句執行了後實現無條件跳轉。
GOTO 語句予大部分高階語言支援,干焦足少的高階語言無支援 GOTO 語句。比如講,goto 是一个 Java 語言的保留字,但是無允准使用。
用法
goto 語句通常佮 IF 語句做伙使用來實現一个條件跳轉。
` ` ` IF_ 板件 _'THEN'goto_ 鋪排 _ ; ` ` `
程式語言一般對 ` goto ` 語句跳轉的位置加以嚴格限制。比如講,佇咧 C 中,無允准跳轉去到另外一个函式內底的標記位置。Setjmp 函式提供矣嘿非本地 goto 的支援。
例
以下 C + + 例當中,咱欲佇二維陣列 ` ar ` 走揣敢有一百這个數。若揣著,愛隨停止搜揣,節省時間。
若使用 ` break ` 干焦會當跳出目前所在的一个 ` for ` 循環,所以就需要使用 ` goto ` 跳出所有循環。
對於 goto 使用的批評
GOTO 語句一直是批評佮爭論的目標,主要的負面影響是使用 GOTO 語句使程式的可讀性變䆀,甚至成做不可維護的「麵條代碼」。 結構化的編程佇咧二十世紀六十年代到七十年代變甲那來那流行,真濟電腦科學家著愛出結論,即程式應當總是使用予人叫做「結構化」控制流程的命令,如迴圈以及 if-then-else 語句來替代 GOTO。甚至佇今仔日,誠濟程式風格編碼標準禁止使用 GOTO 語句。為 GOTO 語句辯護的人認為,加以限制地使用 GOTO 語句袂去予低品質的代碼,並且聲稱佇足濟程式語言內底,一寡任務若無用一條抑是偌條 GOTO 語句是無法度予直接實現的。如有限狀態自動機的實現、跳出岫狀迴圈以及例外處理。
大概上出名的對 GOTO 的批評是艾茲格 ・ 迪傑斯特拉佇一九六八年的一篇名稱做《GOTO 語句有害論》的論文。迪傑斯特拉認為無加限制地使用 GOTO 語句應當對高階語言中廢止,因為伊使分析佮驗證程式正確性(特別是牽涉著迴圈)的任務變複雜。另外一款觀點出現佇高德納的 _ Structured Programming with go to Statements _ 中,文章分析了真濟定定見編程的任務,然後發現講其中的一寡使用 GOTO 共得著上理想的結構。
這寡批評佇一寡程式語言的設計上起到效果。雖然 Ada 語言的設計者佇咧二十世紀七十年代暗期意識著對 GOTO 的批評,這條語句猶原被包含入去,主要是用來支援自動生做遐的 goto 語句必不可少的代碼。猶毋過,做為 goto 語句目的地的標籤必須使用雙尖括號括起來(如:< < Start \ _ Again > >), 啊若這个語法佇咧其他的語言內底攏無予人使用。這予咱檢查的程式內底 goto 目的地的存在變簡單。goto 語句本身使用簡單的形式gotoStart \ _ Again ; .
變體
有真濟無仝款的語言構成會當看做是 _ goto _ 的變形:
限制的 GOTO
足濟語言的,如 C 語言佮 Java,提供了相關的控制流的語句,如 break 和 continue,𪜶攏是有效地去予人限制的 goto 語句。𪜶的作用是無條件跳轉來,但是只會當跳到迴箍仔結束的位置—— 繼續進入後一迴箍仔(continue)抑是結束迴箍(break)。 對於 break 語句,部份的語言允准附加特定參數來控制結束迴箍的範圍,比如講 PHP 允准標記數字參數代表跳出岫狀語句的層數,Java 允准譬如講佇語句開始進前添加 ` < 鋪排 > : `,佇咧語句內底以標籤名作為參數代表跳轉來到愛迴箍語句的結束位置。
對於 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