為什么大神級程序的C語言代碼里到處都是goto?

jopen 10年前發布 | 14K 次閱讀 C語言

當我學C語言時,老師整天告訴我:“不要使用goto, 這是一個壞習慣, 這種寫法很爛,而且很危險!”等等。

但是為什么那么多內核程序員那么喜歡用goto呢?在這段linux內核  https://github.com/torvalds/linux/blob/master/kernel/sched/clock.c  代碼里,我覺得可以用簡單的一個while替換掉,如:

while(condition) {

}

//或

do {

} while(condition);</pre>注*這段代碼來自torvalds的linux內核代碼,其實不僅可以使用while,還有很多地方可以使用if () {} else {} 的結構代替,很多內核的其他文件也是如此,如 fs.open  http://lxr.linux.no/linux+v3.12.6/fs/open.c#L464

對此我很不理解,在某些情況下使用goto比while/do-while好嗎?如果是的話,為什么呢?

by: musicmatze

回答一:

對于這個例子中,我估計是從原來SMP不安全(non-SMP-safe)的方式改成SMP的方式。使用goto語句對原來的代碼改動量最小,引起潛在風險的概率最小。

我其實也不贊成你們用這種方式,但我認為絕對不要使用goto也是一種誤導。在一個只會向前走,絕不會后退的函數里,使用goto絕對不會引起死循環,而且這種方式絕對是最簡單最清楚的跳轉方式。(如通過在清理代碼和返回錯誤時使用)

by: R..

回答二:

歷史:我們也許記得Dijkstra 在1968年寫的 Goto Considered Harmful http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html, 現在快半個世紀過去了。外面已經很少看到goto了。

不過我們來分析一下這個例子,一個關于錯誤處理的,讓我們用結構化的語法來寫:

if (do_something() != ERR) {
    if (do_something2() != ERR) {
        if (do_something3() != ERR) {
            if (do_something4() != ERR) {
                ...

那么,換成goto呢?

if (do_something() == ERR)  // 一行
    goto error;             // |
if (do_something2() == ERR) // |
    goto error;             // |
if (do_something3() == ERR) // |
    goto error;             // V
if (do_something4() == ERR)   // 使用普通的平鋪形式
    goto error;

我們看到這段代碼都是平級的,不相互依辣的,明顯goto的結構更好。

by: Dietrich Epp

注: 這也許從另一個角度詮釋了差點的更好Worse Is Better 的觀點。

來自:http://ourjs.com/detail/52ce07eb2caee88b29000002

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!