php goto語句的利弊詳解

來源:互聯網
上載者:User

一看就知道是goto和call分不清的孩子

然後在群裡敲代碼的時候,小貓用了Do...Loop迴圈,結果群裡有個小朋友問Do...Loop迴圈是什嗎?-_-|||結果一群人都說很少用Do...Loop迴圈,大部分都喜歡用Goto,我才發現這個問題,並不是說不能用Goto,而是少用Goto!!!

廢話講完了,開始正題

先為新手解釋下Goto和Call的區別

Goto是用來跳轉代碼的,即當代碼執行到Goto時,跳轉到Rem指定的位置向下執行,它不會在執行完時,返回到Goto語句的下一條。

Call也是用來跳轉代碼的,但是更準確的說,Call是用來調用子程式的!何為調用?即執行到Call時,將指定的子程式(Sub)放到代碼中,當子程式執行結束後,它會回到Call語句的下一條,繼續向下執行。

如果很難理解,那就用剛開始提到的那位同學的代碼來解釋吧:

這是Goto語句

這是Call語句

1.      a=152.      b=103.      if a-b < 154.          goto sub1//跳轉至Rem sub1處,且不會再跳回來了!!!5.          if a-b > -156.              goto sub27.          end if8.      end if9.       10.   Rem sub211.   MsgBox "a-b大於-15"12.    13.   Rem sub114.   MsgBox "a-b小於15"//指令碼到底部了,執行結束!!!
1.      a=152.      b=103.      if a-b < 154.          call sub1//調用sub1子程式,當子程式執行結束後,返回到此處,繼續向下執行5.          if a-b > -156.              call sub27.          end if8.      end if9.       10.   Sub sub2()11.       MsgBox "a-b大於-15"12.   End Sub13.    14.   Sub sub1()15.       MsgBox "a-b小於15"16.   End Sub


OK,兩種區別講清楚了,現在來講講這次的主題,關於Goto語句的利與弊!!!

我上面說過,我提倡Goto要少用,絕對不能濫用,其中,最主要的一個原因是,Goto語句破壞了程式結構,使程式可讀性變差,你用一個,兩個或許影響不大,但是你如果用了十幾個Goto呢?

下面這段話摘自百度百科(如果大家覺得太多了,那麼你只需看“goto語句的結果”那一段)

問題起源:

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

  goto語句是有害的觀點:

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

  goto語句的爭論:

  在60年代末和70年代初,關於GOTO語句的用法的爭論比較激烈。主張從進階程式語言中去掉GOTO語句的人認為,GOTO語句是對程式結構影響最大的一種有害的語句,他們的主要理由是:GOTO語句使程式的靜態結構和動態結構不一致,從而使程式難以理解,難以查錯。去掉GOTO語句後,可直接從程式結構上反映程式啟動並執行過程。這樣,不僅使程式結構清晰,便於理解,便於查錯,而且也有利於程式的正確性證明。

  持反對意見的人認為,GOTO語句使用起來比較靈活,而且有些情形能提高程式的效率。若完全刪去GOTO語句,有些情形反而會使程式過於複雜,增加一些不必要的計算量。

  關於goto語句的解決方案:

  1974年,D·E·克努斯對於GOTO語句爭論作了全面公正的評述,其基本觀點是:不加限制地使用GOTO語句,特別是使用往回跳的GOTO語句,會使程式結構難於理解,在這種情形,應盡量避免使用GOTO語句。但在另外一些情況下,為了提高程式的效率,同時又不至於破壞程式的良好結構,有控制地使用一些GOTO語句也是必要的。用他的話來說就是:“在有些情形,我主張刪掉GOTO語句;在另外一些情形,則主張引進GOTO語句。”從此,使這場長達10年之久的爭論得以平息。

  後來,G·加科皮尼和C·波姆從理論上證明了:任何程式都可以用順序、分支和重複結構表示出來。這個結論表明,從進階程式語言中去掉GOTO語句並不影響進階程式語言的編程能力,而且編寫的程式的結構更加清晰。[/hide]

  goto語句的結果:

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

如果有仔細看上面這段話的同學,相信能明白goto語句的利與弊了吧?

好吧,還是用代碼來解釋:

濫用goto語句的例子

合理利用goto語句

1.      Rem A2.      If  false3.          goto   B4.      End If5.       6.      Rem C7.      if true8.          goto  A9.      ElseIf false10.       goto   B11.   else   12.       goto   C13.   End If14.    15.   Rem B16.   //這樣的代碼可讀嗎,你可以划出流程圖嗎。而且goto完全是可以用其他語句代替的。
1.      Do2.          Do3.              Do4.                  If  true5.                      Goto 停止//利用goto跳出深層嵌套6.                  End If7.              Loop8.          Loop9.      Loop10.    11.   Rem 停止


講解就到這裡了,小貓的想法就是建議大家如果能不用goto就不用goto,盡量多使用Call,如果想跳出迴圈,每種迴圈都有對應的跳出語句,如exit do,exit for,exit sub,Exit Function
另外當大家需要用到迴圈時,建議使用Do...Loop和For...Next兩者,而while迴圈比較繞口,完全可以用do和for代替他

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.