2016-03-27 129 views
1

我有一個簡單的問題來優化我的代碼。如何工作if()語句

bool myfunc(); 

if (false && true && myfunc()) 
{ 
} 

函數myfunc()被調用?

+3

總之:不,它不會被調用。 –

+0

否。if條件將在第一個錯誤時停止,而不會測試其他兩個條件。 – Drakes

+0

夥計們。答案在_ANSWER部分_ –

回答

4

&&||具有短路評價,即,一旦該結果明確知道(false&&true||)評價停止。它總是嚴格從左到右。

在這種情況下,編譯器甚至可能會選擇完全消除if語句,因爲編譯時的條件已知爲false,因此代碼之後無法訪問。

+0

非常感謝您的幫助 – harut9

+5

準確地說,只有內置的邏輯表達式具有短路語義。當運算符被重載時,表達式是一個正常的函數調用。 –

8

因爲C++有short-circuit evaluation的條件,所以不會調用該函數,因爲第一個false無論如何都會使整個表達式爲false。

如果你改變順序,所以你先把函數調用(即myfunc() && false && true),那麼函數將被調用。儘管如此,表達式的結果仍然是false,無論myfunc返回什麼結果。

+0

如果你在你的答案中寫下訂單,那麼編譯器是不是會優化整個if語句和其範圍內的所有內容?或者在那裏有異常的情況下調用該函數? – Chiel

+2

@Chiel如果函數是來自另一個翻譯單元的外部函數,那麼編譯器無法知道它做了什麼,或者它有什麼副作用,所以函數調用不能被優化。它可以優化的是它除了呼叫外沒有其他任何操作,而忽略返回的值。 –

1

不,myfunc()將不會被調用,因爲第一個false,編譯器將停在那裏。這就是所謂的短路評估。