2012-01-26 24 views
7

me topé con la siguiente construcción en C++:operador | = para un valor booleano en C++

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

supone que este |= era un acceso directo para el operador OR, y que result sería igual true al final si al menos una de estas llamadas a TryAndDoSomething había devuelto true.

Pero ahora me pregunto si más de una llamada realmente puede devolver true. De hecho, si extendemos la operación como:

result = result || TryAndDoSomething(i); 

Entonces se llamará el método sólo si el retorno evaluado para false, es decir, si no hay otra llamada antes volvieron true. Por lo tanto, después de una llamada que devuelve true, no se realizará ninguna otra llamada.

¿Es esta la interpretación correcta?

+1

Puede probarlo fácilmente. Acabo de hacerlo, y parece que se hicieron todas las llamadas, no solo la primera. –

Respuesta

7

En booleanos, | produce el mismo resultado que ||, pero no produce un cortocircuito. El operando derecho de |= siempre se evalúa.

+0

@MooingDuck: esta pregunta solo pregunta sobre booleanos. No sé si el OP sabe acerca de bitwise-O, y no parece importante para lo que está haciendo. –

+0

Id estar más contento con la respuesta si dijera cómo eran diferentes para los no booleanos dado que el OP obviamente no sabe sobre bitwise o (error ortográfico corregido) –

13

Es la asignación OR bit a bit, no en cortocircuito O la evaluación. Es equivalente a:

result = result | TryAndDoSomething(i); 

no

result = result || TryAndDoSomething(i); 
2

La única diferencia en este contexto entre x |= f() (OR bit a bit) y x = x || f() (OR lógico) es que el último es cortocircuitos. En el primero, f() se ejecutará n veces, a menos que, por supuesto, f() arroje una excepción, pero esa es otra historia.

En la versión ||, f() ya no se llamará una vez que se convierte en xtrue. C++ no tiene un operador ||=, pero es importante entender que |= y ||= (si existiera) tendrían semántica diferente debido a esto. |= no es solo un reemplazo para el ||= que falta.

Como nota al margen, siempre que se esté utilizando bool, la operación en modo bit es seguro, ya que la norma especifica que true y false convertir a los enteros 1 y 0, respectivamente. Entonces, la única diferencia en este caso es la evaluación entusiasta frente a la pereza.

+0

@MooingDuck: Verdadero. Editado para restringir el contexto del OP. –

+0

Todo lo que tiene que decirle es que su interpretación no es válida. | = es el OR a nivel de bit como usted señala. Entonces x | = 1 es lo mismo que hacer x = x | 1. X || = 1; no compilará –

+0

@Ramhound: Lee la pregunta nuevamente. –

0

result |= Try() es la abreviatura de result = result | Try();. El operador || parece entender, pero el operador | es bastante diferente. Su nombre es bitwise o (a diferencia de logical o). Tiene el mismo efecto que si se llevara a cabo a=a||b en cada bit de los operandos, y no tiene el recurso de rescate rápido que lógico y/o tiene. (También es loco rápido, tan rápido o más rápido que la suma). Las otras operaciones bit a bit son & (bitwise y: a=a&&b en cada bit), y ^ (bitwise xor: a=(a!=b) en cada bit).

+0

@BenVoigt: copiar-pegar FTL! ¡Gracias! Fix'd. –

Cuestiones relacionadas