2012-02-15 36 views
1

我的問題是:如果(c == 0 && d == 0 && etc ...)或者(c == 0)if(d == 0)等等,執行速度更快...?

如果我有一個if語句可以說10條件,如果我把它們全部放在一個if語句中,編譯器會檢查所有10條語句的條件嗎?或者只要發現一個錯誤情況就會中斷?

如果否則執行一旦發現錯誤條件就會結束,例如在這種情況下, if(c==0 && d==4 || r ==3 && etc...)

+0

哪種語言? – 2012-02-15 09:25:09

+1

'if(c == 0 && d == 0)'在邏輯上不等於if(c == 0)else if(d == 0)'。它們不代表相同的控制流程。 (c == 0)if(d == 0) – ArjunShankar 2012-02-15 09:28:20

+0

我很抱歉,哪一個會更快,使用布爾操作符還是不使用它們? – user1210877 2012-02-15 10:54:23

回答

2

這叫做短路

例如,在C++中,對於嵌套的&&條件,保證檢查將在遇到的第一個false處停止。

這當然高度依賴於語言。

2

這取決於是否布爾運算符& &和||是否使用短路。 在像C,C++,C#,Java這樣的語言中,情況就是如此。

短路意味着如果整個布爾表達式的值可以準確地被確定,那麼其餘的表達式不被評估,短路意味着從左到右。

+0

所以,如果語言具有短路功能,那麼如果(c == 0)if(d == 0) – user1210877 2012-02-15 11:04:46

+0

編譯器可以根據需要編譯它們,包括在程序集級別忽略快捷方式行爲,如果它產生的行爲是_as if_它完全符合語義編譯。請參閱[本示例](https://godbolt.org/g/R4mBic),其中程序集將謂詞中的術語進行評估,儘管只要它看到錯誤的值,它就會立即進行修改。 OP的問題沒有副作用,所以這種優化是可能的。 – BeeOnRope 2017-01-29 20:37:24

0

這取決於編譯器的...懶惰和快捷方式

但其中大部分當你有(條件& &條件.. & & ......)將在第一個假...

結束

所以如果(條件)比條件下的速度快10分鐘......

+0

這不取決於編譯器,它取決於語言。例如。在C中,_all_編譯器必須快捷&&和||運算符 – nos 2012-06-30 13:56:29

+0

好吧,這取決於語言標準..但我仍然可以編寫我自己的編譯器,它將等待直到所有條件都被讀取,並且如果(obj!= null && obj.toStr())將引發NullPointerException。 ...但是,我是第二次發言,你是對的,這是語言規範。 – Darwly 2012-07-02 08:42:02

0

對於所有合理的語言/語言實現,這些應該是相同的。

正如其他指出的那樣,如果(一個& & b & & C){代碼}語法由合理的編譯器優化。

到目前爲止還沒有解釋的是,它們的優化部分是因爲編譯器必須積極地做錯事情來使其優化。原因在於這種「短路」通常也被編入機器碼中。你的代碼將變成彙編代碼,如下所示:

IFNOT a, skip_code 
IFNOT b, skip_code 
IFNOT c, skip_code 

code: 
    ... 

skip_code: 
    ... 

因此,如果檢查發現一個失敗,CPU將逐步完成其中的每一步。如果如果發現一個失敗,它將跳轉到最後並忽略if(...){code}塊的其餘部分。

注意,看起來多麼相似:

if (a) { 
    if (b) { 
     if (c) { 
      code 
     } 
    } 
} 

他們是同樣的事情。任何理智的編譯器都會確保它們是相同的。

做到不短路,編譯器作者必須主動選擇是這樣的:

SET badForCodeRun,False 

IF a, skipA 
SET badForCodeRun, True 
GOTO skipCode 

skipA: 

IF b, skipB 
SET badForCodeRun, True 
... 

skipCode: 

老實說,我甚至不能被人打擾輸入了錯誤的方式,因爲它是如此長囉嗦和愚蠢:)簡短的回答是:它永遠不會比短路任何其他方式。