首頁  >  文章  >  後端開發  >  php goto語句的利弊詳解

php goto語句的利弊詳解

黄舟
黄舟原創
2018-05-15 15:54:139120瀏覽

一看就知道是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=15
2.      b=10
3.      if a-b < 15
4.          goto sub1//跳转至Rem sub1处,且不会再跳回来了!!!
5.          if a-b > -15
6.              goto sub2
7.          end if
8.      end if
9.       
10.   Rem sub2
11.   MsgBox "a-b大于-15"
12.    
13.   Rem sub1
14.   MsgBox "a-b小于15"//脚本到底部了,执行结束!!!
1.      a=15
2.      b=10
3.      if a-b < 15
4.          call sub1//调用sub1子程序,当子程序执行结束后,返回到此处,继续向下执行
5.          if a-b > -15
6.              call sub2
7.          end if
8.      end if
9.       
10.   Sub sub2()
11.       MsgBox "a-b大于-15"
12.   End Sub
13.    
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 A
2.      If  false
3.          goto   B
4.      End If
5.       
6.      Rem C
7.      if true
8.          goto  A
9.      ElseIf false
10.       goto   B
11.   else   
12.       goto   C
13.   End If
14.    
15.   Rem B
16.   //这样的代码可读吗,你可以划出流程图吗。而且goto完全是可以用其他语句代替的。
1.      Do
2.          Do
3.              Do
4.                  If  true
5.                      Goto 停止//利用goto跳出深层嵌套
6.                  End If
7.              Loop
8.          Loop
9.      Loop
10.    
11.   Rem 停止


讲解就到这里了,小猫的想法就是建议大家如果能不用goto就不用goto,尽量多使用Call,如果想跳出循环,每种循环都有对应的跳出语句,如exit do,exit for,exit sub,Exit Function
另外当大家需要用到循环时,建议使用Do...Loop和For...Next两者,而while循环比较绕口,完全可以用do和for代替他

以上是php goto語句的利弊詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn