2012-01-26 56 views
7

我在C++中偶然發現了以下建築:運算符| =在C++的布爾

bool result = false; 
for(int i = 0; i<n; i++){ 
    result |= TryAndDoSomething(i); 
} 

我認爲這|=是爲OR操作的快捷方式,並result將在年底如果相等true至少其中一個致電TryAndDoSomething的電話已返回true

但現在我想知道如果多個電話實際上可以返回true。事實上,如果我們延長操作:

result = result || TryAndDoSomething(i); 

那麼只有當收益評估,以false的方法將被調用,也就是說,如果沒有其他調用之前返回true。因此,在一次呼叫返回true後,不會有其他呼叫完成。

這是正確的解釋嗎?

+1

您可以輕鬆測試。我剛剛做到了,看起來所有的電話都是通話,而不僅僅是第一個。 –

回答

7

在布爾值上,|的結果與||的結果相同,但不會發生短路。 |=的右操作數總是被評估。

+0

@MooingDuck:這個問題只是詢問布爾值。我不知道OP是否知道按位或運算,並且它看起來並不重要。 –

+0

因爲OP顯然不知道按位或(糾正的錯字) –

13

它是按位或分配,不是短路或評估。它等效於:

result = result | TryAndDoSomething(i); 

result = result || TryAndDoSomething(i); 
2

在此上下文中x |= f()(逐位OR)和x = x || f()(邏輯OR)之間的唯一區別是,後者是短路。在前者中,f()將執行n次 - 除非當然f()引發異常,但那是另一回事。

||版本中,當x變爲true時,將不再調用f()。 C++沒有||=運算符,但重要的是要明白|=||=(如果存在)會因此而具有不同的語義。 |=不僅僅是缺失的||=的替代品。

作爲一個側面說明,只要您使用bool,按位運算安全的,因爲該標準規定,truefalse轉換爲整數10,分別。所以在這種情況下唯一的區別是急於評估和懶惰評估。

+0

@MooingDuck:是的,如果你說他們對於非布爾值是不同的,我會更高興。編輯限制在OP的上下文中。 –

+0

所有你必須告訴他的是他的解釋是無效的。 | =是你指出的按位或。所以x | = 1與x = x |相同1. X || = 1;不會編譯。 –

+0

@Rhhound:再次閱讀問題。 –

0

result |= Try()result = result | Try();的簡稱。您似乎瞭解||運營商,但運營商的|完全不同。它的名字是按位或(而不是邏輯或)。它具有相同的效果,就好像它在操作數的每個上執行了a=a||b,並且不具有邏輯和/或具有的快速救援功能。 (這也是瘋狂快;速度快或比添加快)。其他按位操作是&(按位和:a=a&&b在每位上)和^(按位xor:a=(a!=b)在每位上)。

+0

@BenVoigt:複製粘貼FTL!謝謝! Fix'd。 –