2012-01-26 15 views
7

mi sono imbattuto la seguente costruzione in C++:Operatore | = per un valore booleano in C++

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

ho supposto che questo |= era una scorciatoia per l'operatore OR, e che result sarebbe uguale true alla fine se almeno una di queste chiamate a TryAndDoSomething ha restituito true.

Ma ora mi chiedo se più di una chiamata può effettivamente restituire true. Infatti se si estende l'operazione:

result = result || TryAndDoSomething(i); 

Poi il metodo sarà chiamato solo se ritorno valutata per false, cioè, se nessun altro chiamata prima restituito true. Pertanto, dopo una chiamata che restituisce true, non verrà effettuata alcuna altra chiamata.

Questa è l'interpretazione corretta?

+1

È possibile testarlo facilmente. L'ho appena fatto, e sembra che tutte le chiamate siano fatte, non solo la prima. –

risposta

7

Sui booleani, | produce lo stesso risultato di ||, ma non cortocircuito. L'operando destro di |= viene sempre valutato.

+0

@MooingDuck: questa domanda riguarda solo i booleani. Non so se l'OP sa di bit-OR, e non sembra importante per quello che sta facendo. –

+0

Id essere più felice con la risposta se hai detto come erano diversi per non-booleani poiché l'OP ovviamente non sa bitwise o (refuso corretto) –

13

È un'assegnazione OR bit a bit, non una valutazione OR in cortocircuito. È equivalente a:

result = result | TryAndDoSomething(i); 

non

result = result || TryAndDoSomething(i); 
2

L'unica differenza in questo contesto tra x |= f() (OR bit a bit) e x = x || f() (OR logico) è che quest'ultimo è corto-circuito. Nel primo caso, f() verrà eseguito n volte, a meno che, naturalmente, f() non crei un'eccezione, ma questa è un'altra storia.

Nella versione ||, f() non verrà più chiamato una volta x diventa true. C++ non ha un operatore ||=, ma è importante capire che |= e ||= (se esistesse) avrebbe una semantica diversa a causa di ciò. |= non è solo una sostituzione per lo ||= mancante.

Come nota a margine, a condizione che si sta utilizzando bool, dell'operazione bit a bit è sicuro, perché la norma specifica che true e false convertire in interi rispettivamente 1 e 0,. Quindi l'unica differenza in questo caso è la valutazione ansiosa rispetto a quella pigra.

+0

@MooingDuck: True. Modificato per limitare il contesto dell'OP. –

+0

Tutto quello che devi dirgli è che la sua interpretazione non è valida. | = è l'OR bit a bit che si indica. Quindi x | = 1 equivale a fare x = x | 1. X || = 1; non verrà compilato. –

+0

@Ramhound: leggi di nuovo la domanda. –

0

result |= Try() è l'abbreviazione di result = result | Try();. L'operatore || sembra capire, ma l'operatore | è molto diverso. Il suo nome è bit a bit o (a differenza di logico o). Ha lo stesso effetto come se eseguisse a=a||b su ogni bit degli operandi, e non ha la cosa di salvataggio rapido che logico e/o ha. (È anche pazzo veloce, veloce o più veloce dell'aggiunta). Le altre operazioni bit a bit sono & (bit per bit e: a=a&&b per ciascun bit) e ^ (bit per bit xor: a=(a!=b) per bit).

+0

@BenVoigt: Copia-incolla FTL! Grazie! Fix'd. –