為什麼大神級程式的C語言程式碼裡到處都是goto?

Web開發者發表於2014-01-09

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

  但是為什麼那麼多核心程式設計師那麼喜歡用goto呢?在這段linux核心  https://github.com/torvalds/linux/blob/master/kernel/sched/clock.c  程式碼裡,我覺得可以用簡單的一個while替換掉,如:

while(condition) {

} 

//或

do {

} while(condition);

  注*這段程式碼來自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

  原文 stackoverflow.com

相關文章