2015-12-02 102 views
8

假設我有||運算符的左/右兩個表達式。我發現如果左表達式是真的,那麼正確的運算符將永遠不會被調用。例如,在我的下面的代碼中,當getRand返回true時,我發現Foo將永遠不會被調用。我在Mac OSX上的XCode上進行了測試,並且懷疑它是否是我們可以依賴的C++的可靠特性 - 如果剩下的部分是||是真的,右邊的部分永遠不會被調用,或者它只是特定平臺的特殊功能(例如帶有XCode的OSX)?發佈我的代碼如下,謝謝。被C++邏輯OR(||)運算符困惑

bool Foo() 
{ 
    std::cout << "I am called!\n"; 
    return false; 
} 

bool getRand() 
{ 
    int random_variable = std::rand(); 
    std::cout << random_variable << '\n'; 

    return random_variable % 2 == 1; 
} 

int main(int argc, const char * argv[]) { 

    if (getRand() || Foo()) 
    { 
     std::cout<<"Hello World \n"; 
    } 

    return 0; 
} 

在此先感謝, 林

+2

'想知道它是否是我們可以信賴的C++的可靠特性嗎?是的。 – Matt

+2

&&也有短路評估,如果第一個參數是假的 – sp2danny

+2

短路評估是一個可靠的功能 - 大部分時間_。如果使用的類型有&&運算符重載,它將不起作用。像「bool」這樣的原始類型是安全的。 – kolrabi

回答

10

是的,這就是所謂的short circuit evaluation保證功能。

同樣,表達式false && expression將永遠不會評估正確的表達式。

+0

謝謝wallyk!標記爲已回答。 :) –

8

想知道它是否是C++的可靠特性,我們可以依賴 - 是真的,正確的部分永遠不會被調用?

是的,適用於內置操作員。

從標準,$ 5.15/1邏輯OR運算符[expr.log.or](由我粗體)

的||運營商組從左到右。操作數都是 上下文轉換爲布爾(第4章)。如果操作數的其中一個爲 爲真,則返回true,否則返回false。與|,||不同保證 從左到右評估; 如果第一個操作數的計算結果爲真,則第二個操作數不是 。

並注意operator||的超載將失去此特殊屬性。

Logical operators(粗體由我)

內置操作符& &和||執行短路評估(如果結果在評估 後得出結果是已知的,則不要求 評估第二個操作數),但重載操作符的行爲與常規函數 的調用相同,並始終評估兩個操作數

+0

謝謝songyuanyao,優秀的回覆。投票。 :) –

1

由於它的一種或另一種選擇,不需要對第二部分進行評估,不依賴於平臺是語言特徵。

+1

感謝丹尼爾,優秀的回覆。投票。 :) –