c++ - ejemplos - operadores logicos informatica
¿Los operadores &=y |=para bool cortocircuito? (6)
Al escribir código como este en C ++:
bool allTrue = true;
allTrue = allTrue && check_foo();
allTrue = allTrue && check_bar();
check_bar()
no se evaluará si check_foo()
devolvió false
. Esto se denomina evaluación de cortocircuito o cortocircuito y es parte del principio de evaluación perezosa.
¿Funciona esto con el operador de asignación compuesto &=
?
bool allTrue = true;
allTrue &= check_foo();
allTrue &= check_bar(); //what now?
Para lógico OR
reemplazar todos &
con |
y true
con false
.
Como & es una operación de bit, check_foo () se evaluará primero independientemente del valor de allTrue en
allTrue &= check_foo(); // also for allTrue = allTrue & check_foo();
y también
allTrue &= check_bar(); // also for allTrue = allTrue & check_bar();
Sin embargo, no se llamará a check_foo () si usa && y alltrue es falso como en:
allTrue = allTrue && check_foo();
Desde C ++ 11 5.17 Assignment and compound assignment operators
:
El comportamiento de una expresión de la forma E1 op = E2 es equivalente a E1 = E1 op E2, excepto que E1 se evalúa solo una vez.
Sin embargo, estás mezclando el AND lógico que hace cortocircuito, y el AND a nivel de bits que nunca lo hace.
El fragmento de texto &&=
, que sería la forma en que haría lo que está preguntando, no se encuentra en ninguna parte del estándar. La razón de ello es que en realidad no existe: no hay un operador lógico y de asignación.
El código allTrue &= check_foo();
es equivalente a allTrue = allTrue & check_foo()
En el que está utilizando bitwise AND
y no se realiza una evaluación perezosa.
El bitwise AND
debe tomar dos argumentos cuya representación binaria tiene la misma longitud y utiliza la operación logical AND
para comparar cada par de bits correspondiente.
La evaluación de cortocircuito (es decir, perezosa) es solo para aplicaciones lógicas &&
y ||
. Bitwise &
y |
evaluar ambos argumentos.
No, no se acortan.
Tenga en cuenta que los operadores &=
y |=
se forman como &
+ =
y |
+ =
. Operadores de bits &
y |
No realiza la evaluación de acceso directo.
Sólo operadores booleanos &&
y ||
ejecutalo
Significa, que un operador de acceso directo debería tener el nombre tradicional de &&=
y ||=
. Algunos idiomas los proporcionan. C / C ++ no lo hace.
Primero: a &= b;
no es lo mismo que a = a && b;
. a &= b;
significa a = a & b;
. En C / C ++ no hay a &&= b;
.
Logical AND a && b
es un poco como una prueba para 1 bit. Si el primer "bit" ya es 0, el resultado siempre será 0 sin importar el segundo. Por lo tanto, no es necesario evaluar b
si el resultado ya está claro en a
. El estándar C / C ++ permite esta optimización.
Bitwise AND a & b
realiza esta prueba para todos los bits de a
y b
. Entonces b
necesita ser evaluado si al menos un bit en a
sería distinto de cero. Tal vez podría desear que si a==0
, entonces b
no se evaluara, pero esta optimización no está permitida en C / C ++.