Operator | = für einen booleschen Wert in C ++

8

Ich stolperte über die folgende Konstruktion in C ++:

%Vor%

Ich nahm an, dass diese |= eine Abkürzung für den Operator OR war und dass result am Ende gleich true wäre, wenn mindestens einer dieser Aufrufe von TryAndDoSomething true zurückgegeben hätte.

Aber jetzt frage ich mich, ob mehr als ein Anruf tatsächlich true zurückgeben kann. In der Tat, wenn wir die Operation wie folgt erweitern:

%Vor%

Dann wird die Methode nur aufgerufen, wenn die Rückgabe an false ausgewertet wurde, dh wenn kein anderer Aufruf zuvor true zurückgegeben hat. Nach einem Anruf, der true zurückgibt, wird kein weiterer Anruf ausgeführt.

Ist das die richtige Interpretation?

    
Dunaril 26.01.2012, 16:02
quelle

4 Antworten

9

Bei% Boolean liefert | das gleiche Ergebnis wie || , aber nicht kurzgeschlossen. Der rechte Operand von |= wird immer ausgewertet.

    
Ben Voigt 26.01.2012, 16:05
quelle
13

Es ist eine bitweise ODER-Zuweisung, keine kurzgeschlossene ODER-Auswertung. Es entspricht:

%Vor%

nicht

%Vor%     
Chris Shain 26.01.2012 16:05
quelle
2

Der einzige Unterschied in diesem Zusammenhang zwischen x |= f() (bitweises OR) und x = x || f() (logisches ODER) besteht darin, dass letzteres kurzschließt. Im ersten Fall wird f() n mal ausgeführt - es sei denn natürlich f() löst eine Ausnahme aus, aber das ist eine andere Geschichte.

In der || Version wird f() nicht mehr aufgerufen, wenn x zu true wird. C ++ hat keinen ||= Operator, aber es ist wichtig zu verstehen, dass |= und ||= (falls es existiert) aufgrund dessen eine andere Semantik haben. |= ist nicht nur ein Ersatz für das fehlende ||= .

Als Randnotiz, vorausgesetzt, Sie verwenden bool , ist die bitweise Operation sicher , da der Standard angibt, dass true und false in die Ganzzahlen 1 und% konvertieren co_de% bzw. Also der einzige Unterschied in diesem Fall ist eifrig gegen faul Bewertung.

    
Jon Purdy 26.01.2012 16:06
quelle
0

result |= Try() ist die Abkürzung für result = result | Try(); . Der Operator || scheint Sie zu verstehen, aber der Operator | ist ganz anders. Der Name ist bitweise oder (im Gegensatz zu logisch oder). Es hat den gleichen Effekt, als ob es a=a||b auf jedem Bit der Operanden ausgeführt hätte, und hat nicht das Quick-Bailout-Ding, das logisch und / oder hat. (Es ist auch verrückt schnell; so schnell oder schneller als die Addition). Die anderen bitweisen Operationen sind & (bitweise und: a=a&&b für jedes Bit) und ^ (bitweise xor: a=(a!=b) für jedes Bit).

    
Mooing Duck 26.01.2012 16:12
quelle

Tags und Links