我的問題是:如果(c == 0 && d == 0 && etc ...)或者(c == 0)if(d == 0)等等,執行速度更快...?
如果我有一個if語句可以說10條件,如果我把它們全部放在一個if語句中,編譯器會檢查所有10條語句的條件嗎?或者只要發現一個錯誤情況就會中斷?
如果否則執行一旦發現錯誤條件就會結束,例如在這種情況下, if(c==0 && d==4 || r ==3 && etc...)
。
我的問題是:如果(c == 0 && d == 0 && etc ...)或者(c == 0)if(d == 0)等等,執行速度更快...?
如果我有一個if語句可以說10條件,如果我把它們全部放在一個if語句中,編譯器會檢查所有10條語句的條件嗎?或者只要發現一個錯誤情況就會中斷?
如果否則執行一旦發現錯誤條件就會結束,例如在這種情況下, if(c==0 && d==4 || r ==3 && etc...)
。
這叫做短路。
例如,在C++中,對於嵌套的&&
條件,保證檢查將在遇到的第一個false
處停止。
這當然高度依賴於語言。
這取決於是否布爾運算符& &和||是否使用短路。 在像C,C++,C#,Java這樣的語言中,情況就是如此。
短路意味着如果整個布爾表達式的值可以準確地被確定,那麼其餘的表達式不被評估,短路意味着從左到右。
所以,如果語言具有短路功能,那麼如果(c == 0)if(d == 0) – user1210877 2012-02-15 11:04:46
編譯器可以根據需要編譯它們,包括在程序集級別忽略快捷方式行爲,如果它產生的行爲是_as if_它完全符合語義編譯。請參閱[本示例](https://godbolt.org/g/R4mBic),其中程序集將謂詞中的術語進行評估,儘管只要它看到錯誤的值,它就會立即進行修改。 OP的問題沒有副作用,所以這種優化是可能的。 – BeeOnRope 2017-01-29 20:37:24
這取決於編譯器的...懶惰和快捷方式
但其中大部分當你有(條件& &條件.. & & ......)將在第一個假...
結束所以如果(條件)比條件下的速度快10分鐘......
對於所有合理的語言/語言實現,這些應該是相同的。
正如其他指出的那樣,如果(一個& & 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:
老實說,我甚至不能被人打擾輸入了錯誤的方式,因爲它是如此長囉嗦和愚蠢:)簡短的回答是:它永遠不會比短路任何其他方式。
哪種語言? – 2012-02-15 09:25:09
'if(c == 0 && d == 0)'在邏輯上不等於if(c == 0)else if(d == 0)'。它們不代表相同的控制流程。 (c == 0)if(d == 0) – ArjunShankar 2012-02-15 09:28:20
我很抱歉,哪一個會更快,使用布爾操作符還是不使用它們? – user1210877 2012-02-15 10:54:23