關於goto語句的使用

2021-06-13 02:38:31 字數 1233 閱讀 6881

在專案中用到了大量的goto語句,遭到了領導的指責,感覺挺委屈的。

作為乙個程式設計師,在很多地方都看到說要避免goto語句的使用。goto語句如洪水猛獸,其實都誤解了goto。濫用goto的確很恐怖,可是合理使用卻能夠對程式的結構效能有很大幫助。以下簡單說一下專案中用到goto的3類地方。

1,多重迴圈巢狀。這是乙個配置檔案解析的例子,第一重迴圈讀取檔案一定長度的字串,第二重迴圈判斷讀取的字串是否包含行結束符。如果包含,提出一行,然後做處理,餘下的字元放入另乙個緩衝,下次再用;如果不包含,則再繼續讀檔案。如果沒有包含行結束符,需要跳到第一重迴圈處,由於現在在第二重迴圈,用break語句是不行的。可以設定乙個區域性變數標識是否獨到行結束符,第二重迴圈結束後根據標識判斷是否需要處理(讀到完整一行需要另作處理)。由於另外引用了乙個標識,**其實更混亂了。這才二重迴圈了,如果多重迴圈呢,就要不斷的宣告臨時變數。而用goto語句,這些臨時變數都省略了。

2,函式出錯處理。乙個整數安裝函式,首先要判斷傳入引數是否合理,其次引數證書,然後開啟系統庫,最後安裝證書。任何一步出錯都要釋放前面所有的開啟的資源,函式成功也要釋放資源。如果不用goto,每一步出錯的時候都要重新寫一遍前面資源的釋放語句。如果某天某個資源的釋放函式變了,則每一處都要修改。程式設計師一般都很討厭這種純體力的修改,枯燥無味還很容易漏掉。有沒有其他什麼辦法呢?答案是用goto語句。每一步失敗,直接goto到函式收尾處,在收尾處根據資源是否申請成功(可根據是否null來判斷),決定是否釋放。所有的釋放函式寫到了乙個地方,**簡練了很多,且容易維護。這種情況很容易出現,最早的時候,我也是不敢用goto,但是最終發現goto可以解決問題,為何不用?到現在我都大膽了。當然關於函式出錯處理的資源釋放可以用auto指標,相比最粗放的做法簡練了很多,但是仍然沒有goto來的簡潔,效率也不夠好。另外,對於不同資源的釋放方式不同,就要寫不同的auto指標類了。

3,模組的清晰劃分。考慮乙個安裝證書的demo,第一步是安裝根證書,第二步是安裝證書,第三步是查詢證書,第四步是驗證證書,最後還要返回第一步讓使用者再次做選擇。每一步根據使用者的選項做處理,比如使用者選擇安裝根證書,執行安裝根證書功能,完成後進入安裝證書部分,仍由使用者做出選擇。不用goto的話,首先要寫乙個while迴圈,因為要返回第一步,其次要寫大量的if和else巢狀。而用了goto之後,每一功能可以用乙個goto標籤標識,執行完一步或者退出執行這一步只需要goto到下乙個功能即可,**簡練了很多。

其實,不應該怕goto,他畢竟給了我們一種選擇,優秀的程式設計師知道什麼時候該用什麼,不該用什麼,掌握好goto的優缺點,做到心中有數,就不僅不怕,還會用的很爽。

goto 語句的使用

goto語句包括兩個部分 goto和乙個標籤名稱。標籤的命名遵循與命名變數相同的約定。goto part1 標籤需要寫上工作的語句。part1 printf there is part1 n 觀察以下程式的執行結果 可以看到,當執行 goto 語句之後,程式就跳轉到part1 printf ther...

goto語句的使用

goto語句使用一定要在判斷中進行操作,如果再順序語句中,隨意的進行跳轉,那麼程式會具備極大的不確定性,比如前面定義了乙個變數,後面值已經改變了,然後goto又跳轉到定義處,那麼這個變數是定義的值還是後面改變的值?量大,這就不好控制了,所以一定要約束goto語句。include include in...

21 goto語句的使用

n年前,軟體開發的一代宗師 迪傑斯特拉 dijkstra 說過 goto statment is harmful 並建議取消goto語句。因為goto語句不利於程式 的維護性。這裡我也強烈建議不要使用goto語句,除非下面的這種情況 define free p if p main lname cha...