c語言goto語句到底用還是不用?
作為一個初學者是否建議我掌握它
工作中錯誤處理時經常會用到。不要把goto妖魔化。
先說結論,可以用。
國內大部分教材引導的方向是盡量避免使用,因為可能會導致語句上下文不明確,但如果學習過彙編(MIPS或者Intel),就會發現goto其實是J指令(或類似指令)的後裔。
不過C語言作為一門高級語言,已經存在了for或者while之類的流程式控制制,大多數情況下使用goto反而會更繁瑣。在實際應用中,goto常會被用來跳出多層循環。
生產環境中,多層循環都是要盡量避免的hhh。
需要問這個問題,就不能用。
看需求。
如果想了解的話,《Linux設備驅動程序》一書中有提到為什麼大家懼怕使用GOTO以及正確的使用方式。
特定場景下可以用並且很常用,比如驅動開發
最近翻CPython的源代碼的時候經常看到goto語句, goto語句在CPython的源代碼中大量存在, 而且基本上都是goto fail 等這種形式, 用來表示如果這段代碼失敗或者成功該怎樣. 這樣寫的C代碼可以用宏統一控制錯誤處理.
"goto語句有害"是迪傑斯特拉提出來的, 主要是因為迪傑斯特拉認為goto語句會破壞程序的局部性降低效率. 不過像CPython中的goto fail這種本來就會因為各種錯誤而破壞程序的局部性, 所以這種goto語句並沒有多大的壞處. 而且如果你像CPython中統一使用goto fail其實可以增加程序的可讀性的, 至少一看都知道這是在處理錯誤的情況.
其實很多的底層代碼裡面都有goto語句, 通常都是用於各種邏輯控制(錯誤,成功,返回,資源清理)的場合, 譬如CPython, Linux等操作系統內核以及基礎庫裡面都有這種代碼.
goto語句可以用, 但至少得等到能研究這些大佬們寫的代碼的時候才能用
我寫代碼相當喜歡用這個語句,讀代碼的人也賞心悅目。同時還可以規避代碼裡面到處return的陋習。
大部分情況是沒必要的,但在少數特定情況下goto也很方便。比如跳出多重循環,比如跳轉到函數結束(比如一個函數可能有多個出口,然後因為要在結束之前進行同樣的一個操作,每次都return前進行這個操作有點麻煩,乾脆不寫這個操作和return,直接跳到函數末尾再處理一下這個操作就好了)
總之還得具體情況具體分析,怎麼寫好就寫哪個,你要說用還是不用太絕對了。
掌握與否的話,我建議你先記住用法就好,沒必要過多研究,以後遇到了自然就明白該在什麼時候用。
goto語句在錯誤處理的時候經常用到,在編程中是可以使用的。
之所以很多編程規範不建議使用goto語句,是因為擔心goto語句被濫用,所以不建議使用。
偶爾在函數內調用一下還是可以的,假如用goto可以使代碼的邏輯更加清晰的話。
絕大多數情況下是不應該使用的。
不過有一種場景還是要用的,否則程序就成翔了。
舉個栗子。
某組件初始化需要多個步驟順序走一遍,全部成功才算成功,任何一個步驟失敗都要按照倒過來的順序撤銷前面已經成功的步驟,並報告失敗。
為了簡化起見,假設只有三個步驟,分別叫做ABC。
用goto時這麼寫:
if(!A())
{
goto Afail;}if(!B())
{
goto Bfail;}
if(!C())
{
goto Cfail;}return TRUE;
Cfail:
undoB();
Bfail:
undoA();
Afail:
return FALSE;
這個套路能夠輕鬆處理步驟很多的初始化過程。
不用goto的話,很多大致一模一樣但還是有點不同的undo和return會分散在每個步驟的錯誤處理分支里,難寫、難維護、易出錯。
一般專業程序員偶爾也會寫一句 goto,然後在旁邊寫一行注釋:/*我錯了,原諒我吧下次不用了*/
goto就是字面意思。
其實代碼接觸多了,什麼時候用goto更好,就是很自然的了。
比如在某個鏈表中遇到了一個特殊的節點,處理後,需要從頭開始執行一遍這個流程。用while感覺語義就不是很自然,用goto就比較清晰。
再就是比較大的函數的異常退出流程,統一用goto處理會比較清晰。
不要強行縮小函數大小
不要強行避免goto
所有規則都有自然存在的意義。別用什麼奇技淫巧,就用他們最原始的含義就行了。
你如果是團隊里最牛的,你寫的別人不會維護。
你如果是最菜的,代碼走查的時候被人噴。
所以是怎樣的動力讓你寫goto?一個人寫著玩,那隨便寫。
初學者還是看看的好,別拿來使。等你有能力閱讀操作系統內核代碼的時候,就不用問用不用這種問題了
在一些複雜的分支問題下我會用goto去做跳轉不是說其他方法做不到而是,這裡用goto是最簡明的
掌握基本語法即可。在實際編程中,除非沒辦法了才用。
c的goto
放到彙編就是jmp
無條件跳轉用的好了
也能增加代碼可讀性
這玩意不看程序
看人
建議掌握(其實也沒什麼難度),但是不建議去大量使用。
如果是初學,先掌握 C 語言中基本的循環語法就行了,以後當你需要用到 goto 的時候,查閱相關博客就可以了。
打基礎階段把重點放在主要的方面,一些相對用的不多的東西可以暫時忽略,等你能力上升一個階段再回頭學習它們會更加輕鬆的。
來自一個自學編程的過來人。
推薦閱讀:
