-
1 # 逆光的背影
-
2 # IT自動化交流
MISRA (The Motor Industry Software Reliability Association),中文名稱為汽車工業軟體可靠性聯會,是英國的一個跨國汽車工業協會,其成員包括了大部分歐美汽車生產商。其核心使命是為汽車工業提供服務和協助,幫助廠方開發安全的、高可靠性的嵌入式軟體。MISRA C則是由MISRA提出的針對嵌入式C語言開發標準,目的是提高嵌入式系統的安全性、可讀性和可移植性。
MISRA C明確規定不能使用goto語句,如下:
規則14.4(強制) :goto 語句不能使用。
規則14.5(強制):continue 不能使用。
規則14.6(強制): 函式應在函式結束有一個出口。
規則14.7(強制):witch、while do 、while for 語句體應是一個混合語句。
規則14.10(強制): 所有if else if 結構都應該由 else 結束。
我想,原因主要為:
1、二十幾年前,當計算機程式設計尚處於起步階段時,程式流程是由“GOTO”語句來控制。該類語句允許程式設計師對當前程式碼行斷行,而直接進入另一個不同的程式碼段,在程式比較簡單是用goto語句是比較靈活,但是當程式比較複雜時很容易造成程式流程的混亂。
2、破壞了清晰的程式結構,使程式的可讀性變差,甚至成為不可維護的"麵條程式碼"。
3、經常帶來錯誤或隱患,比如它可能跳過了某些物件的構造、變數的初始化、重要的計算等語句。
4、GOTO語句使程式的靜態結構和動態結構不一致,從而使程式難以理解,難以查錯。
如果確實不可避免需要使用,下列關於使用goto語句的原則可以供參考:1) 使用goto語句只能goto到同一函式內,而不能從一個函數里goto到另外一個函數里。 2) 使用goto語句在同一函式內進行goto時,goto的起點應是函式內一段小功能的結束處,goto的目的label處應是函式內另外一段小功能的開始處。 3) 不能從一段複雜的執行狀態中的位置goto到另外一個位置,比如,從多重巢狀的迴圈判斷中跳出去就是不允許的。 4)應該避免像兩個方向跳轉。這樣最容易導致"麵條程式碼"。
-
3 # 嵌入式大雜燴
有些人主張用,有些人不主張用。存在即合理,關鍵還是看怎麼用。
1、不提倡使用goto的理由
不提倡使用goto的佔比應該比較多,不提倡的原因主要是:很容易把邏輯弄亂且難以理解。
2、使用goto的理由
這一部分人認為goto可以用在以下兩種情況比較方便:
(1)跳出多層迴圈。
(2)異常處理。
-
4 # 程式設計師小助手
天天與程式碼打交道,來說一個。
本文沒有一句是說程式碼的,可放心閱讀。
只說感受,感同身受!
GOTO 與 LABEL只差一步這一別,咫尺天涯,各自安好!
面向過程程式設計如C語言,彙編指令,你需要在一個流程中執行動作。
然後就是封裝起來,匯入標頭檔案,或包,進行引入。功
能分開,然後還要流程處理,來回跳轉。
對於編寫程式碼,很便捷,可以來去隨意,讓你自由讓你飛!
對於除錯程式碼,很痛苦。
對於維護程式碼,很抓狂。
對於重構程式碼,很崩潰。
誰除錯過誰知道,goto被創造出來,提供給開發者使用,是好事情。
所以,凡是都有一個“最佳實踐”。
有比較好的程式設計規範,程式設計技巧,偏偏不用。
明知山有虎,偏向虎山行!
這種執著,
暫時坑了隊友,
長久坑了自身。
“寫的時候,只有我和上帝知道這段程式碼是幹嘛的。”
“現在,只有上帝知道!”
《GOTO毒害史》下面是歷史上一些觀點:
1968年,Edsger Wybe Dijkstra 首先提出“GOTO語句是有害的”論點。在60年代末,70年代初,關於GOTO語句用法的爭論比較激烈。G·加科皮尼和C·波姆從理論上證明了:任何程式都可以用順序、分支和重複結構表示出來。這個結論表明,從高階程式語言中去掉GOTO語句並不影響高階程式語言的程式設計能力,而且編寫的程式的結構更加清晰。不加限制地使用GOTO語句,特別是使用往回跳的GOTO語句,
會使程式結構難於理解,在這種情形,
應儘量避免使用GOTO語句
在少數幾個使用範圍較廣的語言中的表現:
C/C++等高階程式語言中保留了goto語句,但被建議不用或少用。
Java不提供goto語句,雖然其指定goto作為關鍵字,但不支援使用。Python3提供goto,但其破壞迴圈結構,不推薦使用。PHP5.3+以上提供goto,建議不用。上圖是官方提供的餓一個漫畫,說明GOTO的“副作用”!
高階語言提供goto,供程式設計師使用,
成就程式的同時,也完全可能埋葬自身。
如此有爭議,從保守的角度說,
建議不用!
如果自己寫工具,自己用,自己調,冷暖自知,GO AHEAD!
如果團隊協作,向倉庫提交,不用,可以讓你省心不少,GIVE UP!
以上。
-
5 # 繁星落石
因為不安全。
goto相當於破壞了程式整體的執行順序,透過標籤來決定跳轉的位置,而且跳轉前不會執行檢查,一旦跳轉的內容有問題,可能會導致整個系統的bug。
不過很多C和彙編開發者很喜歡使用goto語句來執行一些異常處理的操作,因為比較方便而且不會讓程式的架構看起來很混亂。在其它語言裡已經不支援goto的用法了,不過只是針對錯誤處理的話,透過捕獲異常可以實現一些情況下的處理。
-
6 # 國安課堂
說實話,我還真沒用過goto, 一般是使用判斷
goto 語句寫完,你還知道這個程式怎麼執行的嗎?
goto之後的語句還要執行嗎?如果要執行,還得goto回來,如果不要執行,寫他幹嘛?
-
7 # 中原說教育
個人認為不主張用goto語句的原因如下:
1.使用goto語句後程序出錯後,不好排查錯誤點。
2. goto
語句是跳躍式的執行,會使得程式原本的結構遭到破壞。3. goto語句會使得程式的邏輯混亂,不易於閱讀
-
8 # 觀上靈雲
如果程式碼不太長,用GOTO是非常簡潔直觀。
但是程式碼一旦長起來,除錯程式的時候找跳轉點就困難了。特別是模組化之後,一旦直接跳出模組很容易把返回點漏了,程式就會產生莫名其妙的問題。
如果是用目標程式設計,那就更麻煩了。
所以為了避免出現這個問題,對很多剛入門程式設計師基本不建議用GOTO語句。
在一個模組內使用goto語句還是很爽的,就是別忘了無論如何都別直接跳出模組去。
回覆列表
可能很多人都不知道goto語句,這邊我說一下goto語句也稱為無條件轉移語句,就是說沒有條件就可以直接跳到你想跳的那一行程式碼,這樣嚴重的影響了程式按順序執行的流程,會讓程式很混亂。別人看你的程式碼的時候可能都明白為什麼,跳來跳去可能把自己都跳暈了,不助於程式碼的理解,有的時候連除錯程式碼都會很費勁,所以說盡量少用這個goto語句,他會打破平衡的。