6

給出連接&&的兩個條件。我知道評估的順序是從左到右。但是,如果第一個條件解決爲false,那麼第二個條件保證不被評估?是否保證if語句不被評估超過必要?

#define SIZE 
bool array[SIZE]; 
int index; 

// play with variables 
// ... 

if(index < SIZE && array[index]) 
{ 
    // ... 
} 

在這個例子中,如果第一條件是假的第二不能進行評估,因爲陣列中的訪問將是超出範圍。

順便說一句,我不能簡單地嵌套條件與兩個if陳述,因爲實際上我需要像(!(in_range && get_element))反相。使用嵌套語句,我需要使用goto跳過下面的代碼塊。

+2

這幾乎與if語句無關。 if語句也只執行一次,但你詢問的事實上是'&&'**操作符**的行爲。 – 2013-05-21 09:09:43

+0

如果它能更好地匹配實際問題,請隨時編輯標籤和問題標題。 – danijar

+0

雖然最精確的重複是上面的一個,但答案在這裏更好:http://stackoverflow.com/questions/5683026/logical-comparisons-is-left-to-right-evaluation-guaranteed,以及在這裏: http://stackoverflow.com/questions/628526/is-short-circuiting-boolean-operators-mandated-in-cc-and-evaluation-order – jogojapan

回答

15

但是,如果第一個條件解析爲false,它的第二個條件保證不被評估?

是的,這是C++的短路。根據C++ 11標準的第5.14/1段:

&&運算符組從左到右。操作數都被內容轉換爲bool(第4章)。 如果兩個操作數都是truefalse,結果是true。不同於&,&&保證從左到右 評估:如果第一個操作數是false,則不評估第二個操作數。

As MatthieuM. correctly mentions in the comments,僅上述適用於內置的邏輯與和邏輯或運算符:如果這些符重載,調用它們被視爲普通函數調用(所以沒有短路適用,無秩序評估保證)。

如第5/2指定:

[:操作符可以重載,也就是,當施加到類型(第 9)或枚舉類型的表達式給出的含義(7.2 )。 重載運算符的使用被轉換爲函數調用,如13.5中的 所述。重載運算符遵守第5章中規定的語法規則,但操作數類型,值類別和評估順序的要求被函數調用的規則所取代。 [...] - 尾註]

+4

注意:這隻適用於內置'和'和'或「運營商;如果用自定義類型重載'和'或'或',則應用常規函數評估規則。 –

+0

@MatthieuM:對,謝謝你提到 –

相關問題