一看就知道是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代替他