2010-12-13 33 views
3

我有兩件代碼:哪一個更好? do {} while(0);或轉到xy;

一個do while循環:

do 
{ 
    errorflag=0; 
    ... 
    if(cond1) 
    { 
     errorFlag=12; 
     break; // Error Conditions 
    } 
    . 
    .   // Processing 
    . 
    if(cond2) 
    { 
     errorflag=56; 
     break; 
    } 
    . 
    . 

} while (0); 

一個goto標籤:

errorflag=0; 
if(cond1) 
{ 
    errorflag=12; 
    goto xy; 
. 
. 
. 
. 
if(Cond2) 
{ 
    errorflag=56; 
    goto xy; 
} 
. 
. 
. 

xy: 

哪一個更好?請詳細說明爲什麼?或者有沒有更好的方法來做到這一點?我們正在優化代碼。我們最看重這些大循環。是彙編級別,沒有太多的優化範圍。請提供您的輸入。

我不喜歡使用其他 - 如果因爲它再次檢查一個條件的開銷。所以在出現問題時直接退出。

我覺得這個編輯我的問題是有道理的提前

感謝

+2

這有什麼錯一個簡單的'其他if'?那裏有多少條件?這實際上是什麼語言? – 2010-12-13 10:29:43

+4

這不是一個很好的問題。這就像「哪個更好:用鈍勺挖出我的大腦,或者用堅果餅乾粉碎了我的睾丸」。兩者都不好,都避免它們!另外,'do ... while'通常(但並非總是)表示你寫錯了代碼。避免它,除非它確實真的有意義。我知道很多人會不同意這種說法,但我總是發現,「雖然......做」結構更容易閱讀,通常只是......更好。 – AlastairG 2010-12-13 11:37:43

+1

@AlastairG:讓你的睾丸碾碎是可以生存的。這顯然是更好的選擇。話雖如此,我想我不會濫用C控制結構並避免懲罰。我同意你關於'do ... while()'我只是不使用它。 – JeremyP 2010-12-13 12:01:16

回答

-8

根據您的問題,此處的選擇是do-whilegoto

我建議你選擇do-while。我不建議您使用goto。那會在稍後引導你做意大利麪代碼。

您可以選擇像ifif-else來得到相同的結果。

說不goto

+5

這是一個無意義的陳述。你可以在沒有'goto'的情況下完美地寫意大利麪代碼,並且可以編寫包含'goto'的乾淨代碼,例如用於錯誤處理。 – glglgl 2011-11-10 15:16:54

+0

@glglgl也適用於錯誤處理的語言。例如,使用結構化異常處理和'finally'子句。如果這是一個足夠好的問題,語言會適應更好的處理(只要它不會太多地破壞語言)。使用'goto'仍然意味着在處理錯誤時你需要記住跳到這個特定的標籤 - 使用'finally' /'catch'可以讓你在其他任何地方使用'return'。這在複製代碼時尤其重要 - 很容易忘記將那個'return'更改爲'goto releaseStuff;'。 – Luaan 2015-07-28 07:50:25

+0

@Luaan如果你有一個適當的異常處理語言,確實沒有理由使用goto。但在C中,這往往是最簡單的事情。 – glglgl 2015-07-28 07:58:45

-3

goto是邪惡之後。只有在絕對沒有其他方式執行此操作時,才應使用gotogoto s會導致不可預知的意大利麪代碼(很難閱讀,理解,調試,在維護階段很容易出錯)。

我相信,有條件的break語句的無限while循環仍然更好,但條件在while語句中表示時更具可讀性。

+1

這裏的循環不是無限的。似乎一個簡單的'else if'會做...(這也表明這個代碼很容易被誤讀,就像@Victor Nicollet的評論中已經提到的那樣) – 2010-12-13 10:31:01

+0

@ 0xA3:理智的聲音... – JeremyP 2010-12-13 10:34:12

+3

使用goto in這種情況比施工過程中被濫用的do/break /清晰得多。 – salva 2010-12-13 11:30:24

13

方案3:

void frobnicate(arguments) 
{ 
    if (cond1) return; 
    if (cond2) return; 

    ... 
} 

frobnicate(the_arguments) 

選擇一個有意義的名稱,並保持它短。

+2

虛擬-1不回答問題。你的'...'應該在兩個ifs之間。 – JeremyP 2010-12-13 10:58:01

4

它們會生成相同的代碼(假設編譯器值得考慮),因此它們之間的區別最容易理解,並且do/while是否會干擾其他的循環結構。如果有這樣的干擾,請使用gotos。否則不要;他們不太清楚(通常)。

仔細看看您的功能是否過於複雜,應該重構爲多個功能,目的更明確,控制流程更簡單。

3

認真嗎?你從未聽說過else

if (cond1) 
{ 
    //stuff 
} 
else if (cond2) 
{ 
    // more stuff 
} 
// etc 

else 
{ 
    // default 
} 

編輯

我誤解了問題。我將在這裏留下舊的答案,因爲這些評論沒有意義。

正確的方法完全相同的代碼按什麼在的問題是:

if (!cond1) 
{ 
    . 
    . 
    . 
    . 
} 

在問題兩種情況下,if (cond2)部分沒有任何影響(假設COND2有沒有副作用),因爲它們都導致跳到下一個將要執行的語句。這就是我爲什麼離開它的原因。

+0

爲什麼downvote?根據所使用的編程語言和條件的數量,此代碼非常簡單易讀。當然,長而複雜的嵌套if對於重構來說總是一個很好的選擇,但在這種情況下,我們知道這樣做太少了。 – 2010-12-13 10:38:38

+0

@ 0xA3:這不是問題的解決方案,這就是爲什麼。 – 2010-12-13 10:49:40

+0

從最初的代碼中,如果基於if的解決方案是'if(!cond1){... if(!cond2){...}}(不需要其他)。 – 2010-12-13 10:49:50