什麼goto語句,你認爲可以接受的使用?我正在討論一些關於C嵌入式工作的編碼指南,並想知道是否存在goto是最乾淨的方式來做事情的情況。
回答
對於C語言,我發現在某些函數中使用goto作爲常用的退出點很有用。如果你需要在返回之前釋放資源,那麼很好做retval = -ERROR; goto fn_exit;
而不是試圖擺脫多層for/while循環。
有些人會認爲在設計良好的代碼中沒有必要 - 當您達到使用goto的吸引力時,您應該將功能分解爲多個子功能。也許在某些情況下這是真的,但是如果你必須傳入多個變量,或者傳遞指向變量的指針,以便子函數可以更新這些值,我覺得你已經增加了不必要的複雜性。
以下是using goto for error management最近的SO問題。我確定瀏覽goto tag會給你更多的答案。
我發現有很多地方goto可能會簡化邏輯。我的規則是沒有兩個goto重疊,goto和它的標籤是'close';通常不超過30線。
通常,當我有一個複雜的條件是我要檢查很多東西,goto語句可能會幫助:
if (condition1 && cond2)
if (checkFile(file))
goto DONE;
else
if (condition3)
goto DONE;
handleError();
return 0;
DONE:
...do something...
return 1;
我可以想到更優雅的解決方案*沒有* goto,所以這不是一個強有力的論點。例如,創建一個函數'int done()',並用'return done()'替換'goto DONE'。幾乎總是有一種比訴諸goto更好的方法。 – Clifford 2010-06-03 16:51:59
@Clifford你是對的,我上面的例子很簡單;但這是關鍵:我提出的goto的使用是針對複雜的邏輯,這很難通過一個簡單的例子來演示。現在,在一些複雜的問題中,我發現一個簡單的goto比其他解決方案的意圖更直接和明確。 – Gianni 2010-06-03 17:07:32
@Clifford你是否在給定的函數中提出了多個return語句? – simon 2010-06-04 00:18:22
我個人的看法是,有goto語句沒有可接受的使用在現代編程語言。
Edsger W. Dijkstra所着的「GOTO聲明被認爲是有害的」,在解決這個問題方面做得很好。該文件應該被要求閱讀這個星球上的每個軟件開發者。
值得注意的是,20世紀70年代晚期UT奧斯汀Don Good小組的Gypsy語言並沒有啓動。
值得注意的是,Ichbiah等人僅在Ada中包含了一個goto,因爲DoD明確要求它在需求規範中的許多單詞中。我記得伊奇比和他的團隊故意將goto目標標籤的語法儘可能地醜化,使標籤像拇指一樣突出,並勸阻使用goto。
- 1. java中goto的用途
- 2. 什麼是可接受的ViewState大小
- 3. `$ .support.ownLast`的用途是什麼?
- 4. TPopupActionBar的用途是什麼?
- 5. _GLOBAL__I_的用途是什麼?
- 6. $ _POST的用途是什麼?
- 7. 「$ this」的用途是什麼?
- 8. CreateSilverlight.js的用途是什麼?
- 9. vertexAttribPointer的用途是什麼?
- 10. RecognizerIntent.DETAILS_META_DATA的用途是什麼?
- 11. Rake的用途是什麼?
- 12. javax.security.auth.callback。*的用途是什麼?
- 13. config.assets.precompile的用途是什麼?
- 14. is_uploaded_file()的用途是什麼?
- 15. archetypeArtifactId的用途是什麼?
- 16. System.Data.SqlClient.SqlParameter.IsNullable的用途是什麼?
- 17. com.sun.org.apache.xpath.internal.operations.String的用途是什麼?
- 18. FXCollections.unmodifiableObservableList的用途是什麼?
- 19. __init__的用途是什麼?
- 20. __cxa_pure_virtual的用途是什麼?
- 21. cURL的用途是什麼?
- 22. RhoMobile的用途是什麼?
- 23. curdoc()的用途是什麼?
- 24. configSections的用途是什麼?
- 25. RegisterGlobalFilters的用途是什麼?
- 26. PhoneGap的用途是什麼?
- 27. gulp.src的用途是什麼?
- 28. AtomicReferenceArray的用途是什麼?
- 29. __name__的用途是什麼?
- 30. RegisterFmxClasses的用途是什麼?
關於這個問題的一個有趣的閱讀是D. D. Knuth的[結構化程序設計與語句](http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf)。它寫在1974年,但仍然包含有趣的例子和想法 – tonio 2010-06-03 16:20:03