Goto(高級程式語言)

本詞條是多義詞,共3個義項
更多義項 ▼ 收起列表 ▲

其中標號需要申請,在對應的過程的申請的位置寫label <標號>;其中,標號必須為byte型整數。

在該段落內還需要有<標號>:表示將要轉向的方向。

基本介紹

  • 中文名:Goto
  • 外文名:Goto
套用舉例,C語言,Pascal語言中的Goto語句,發展歷程,各方看法,有害,爭論,解決方法,結果,注意問題,

套用舉例

C語言

Sample:(2005MSDN上的例子)
#include <stdio.h>
int main()
{
int i, j;
for ( i = 0; i < 10; i++ )
{
printf( "Outer loop executing. i = %d\n", i );
for ( j = 0; j < 3; j++ )
{
printf( " Inner loop executing. j = %d\n", j );
if ( i == 5 )
goto stop;
}
}
/* This message does not print: */
printf( "Loop exited. i = %d\n", i );
stop: printf( "Jumped to stop. i = %d\n", i );//stop: 就是標籤
return 0;
}

Pascal語言中的Goto語句

goto <標號>;
其中標號需要申請,在對應的過程的申請的位置寫label <標號>;其中,標號必須為byte型整數。
在該段落內還需要有<標號>:表示將要轉向的方向。

發展歷程

60年代中期以後,計算機硬體技術日益進步,計算的存貯容量、運算速度和可靠性明顯提高,生產硬體的成本不斷降低。計算機價格的下跌為它的廣泛套用創造了極好的條件。在這種形勢下,迫切要求計算機軟體也能與之相適應。因而,一些開發大型軟體系統的要求提了出來。然而軟體技術的進步一直未能滿足形勢發展的需要,在大型軟體的開發過程中出現了複雜程度高、研製周期長、正確性難以保證的三大難題。遇到的問題找不到解決辦法,致使問題堆積起來,形成了人們難以控制的局面,出現了所謂的“軟體危機”。為了克服這一危機,一方面需要對程式設計方法、程式的正確性和軟體的可靠性等問題進行系列的研究;另一方面,也需要對軟體的編制、測試、維護和管理的方法進行研究,從而產生了程式設計方法學

各方看法

有害

1968年,E·W·代克斯特拉首先提出“GOTO語句是有害的”論點,向傳統程式設計方法提出了挑戰,從而引起了人們對程式設計方法討論的普遍重視。

爭論

在60年代末和70年代初,關於GOTO語句的用法的爭論比較激烈。主張從高級程式語言中去掉GOTO語句的人認為,GOTO語句是對程式結構影響最大的一種有害的語句,他們的主要理由是:GOTO語句使程式的靜態結構和動態結構不一致,從而使程式難以理解,難以查錯。去掉GOTO語句後,可直接從程式結構上反映程式運行的過程。這樣,不僅使程式結構清晰,便於理解,便於查錯,而且也有利於程式的正確性證明。
持反對意見的人認為,GOTO語句使用起來比較靈活,而且有些情形能提高程式的效率。若完全刪去GOTO語句,有些情形反而會使程式過於複雜,增加一些不必要的計算量。

解決方法

1974年,D·E·克努斯對於GOTO語句爭論作了全面公正的評述,其基本觀點是:不加限制地使用GOTO語句,特別是使用往回跳的GOTO語句,會使程式結構難於理解,在這種情形,應儘量避免使用GOTO語句。但在另外一些情況下,為了提高程式的效率,同時又不至於破壞程式的良好結構,有控制地使用一些GOTO語句也是必要的。用他的話來說就是:“在有些情形,我主張刪掉GOTO語句;在另外一些情形,則主張引進GOTO語句。”從此,使這場長達10年之久的爭論得以平息。
後來,G·加科皮尼和C·波姆從理論上證明了:任何程式都可以用順序、分支和重複結構表示出來。這個結論表明,從高級程式語言中去掉GOTO語句並不影響高級程式語言的編程能力,而且編寫的程式的結構更加清晰。

結果

在C/C++等高級程式語言中保留了goto語句,但被建議不用或少用。在一些更新的高級程式語言,如Java不提供goto語句,它雖然指定goto作為關鍵字,但不支持它的使 用,使程式簡潔易讀;儘管如此後來的c#還是支持goto語句的,goto語句一個好處就是可以保證程式存在唯一的出口,避免了過於龐大的if嵌套。

注意問題

goto語句不能跨越變數的定義向後跳轉:
//......
goto end;
int ix=10;
end:
ix=42;//會出現ix未定義的情形
而向前跳過已經執行的變數定義語句是合法的。因為向前跳回到一個變數定義之前,系統在撤銷這個變數,然後重新創建它:
//..........
begin:
int sz=get_size();
if(sz<=0) goto begin;
執行goto語句時,首先撤銷變數sz,然後程式的控制流程跳轉到帶begin:標號的語句繼續執行,再次重新創建和初始化變數sz。

相關詞條

熱門詞條

聯絡我們