usar operadores logicos informatica ejemplos dato comparacion como booleano bool c++ boolean lazy-evaluation short-circuiting compound-assignment

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 ++.