Asumiendo
boolean a = false;
Me preguntaba si hacer:
a &= b;
es equivalente a
a = a && b; //logical AND, a is false hence b is not evaluated.
o por otro lado significa
a = a & b; //Bitwise AND. Both a and b are evaluated.
De la especificación del lenguaje Java - 15.26.2 Operadores de asignación compuesta .
Una expresión de asignación compuesta de la forma
E1 op= E2
es equivalente aE1 = (T)((E1) op (E2))
, dondeT
es el tipo deE1
, excepto queE1
se evalúa solo una vez.
Entonces a &= b;
es equivalente a a = a & b;
.
(En algunos usos, la conversión de tipos marca una diferencia en el resultado, pero en este b
tiene que ser boolean
y la conversión de tipos no hace nada).
Y, para el registro, a &&= b;
no es válido Java. No hay &&=
operador
En la práctica, hay poca diferencia semántica entre a = a & b;
y a = a && b;
. (Si b
es una variable o una constante, el resultado será el mismo para ambas versiones. Solo hay una diferencia semántica cuando b
hay una subexpresión que tiene efectos secundarios. En el &
caso, el efecto secundario siempre ocurre. &&
caso ocurre dependiendo del valor de a
.)
Por el lado del rendimiento, la compensación es entre el costo de la evaluación b
y el costo de una prueba y una rama del valor de a
, y el ahorro potencial de evitar una asignación innecesaria a a
. El análisis no es sencillo, pero a menos que el costo de calcular b
no sea trivial, la diferencia de rendimiento entre las dos versiones es demasiado pequeña para que valga la pena considerarla.
ver 15.22.2 del JLS . Para operandos booleanos, el
&
operador es booleano, no bit a bit. La única diferencia entre&&
y&
para los operandos booleanos es que&&
está en cortocircuito (lo que significa que el segundo operando no se evalúa si el primer operando se evalúa como falso).Así, en su caso, si
b
es una, primitivoa = a && b
,a = a & b
ya &= b
todos hacen lo mismo.fuente
Es el último:
fuente
Aquí hay una manera simple de probarlo:
La salida es
b() was called
, por lo tanto, se evalúa el operando de la derecha.Entonces, como ya lo mencionaron otros,
a &= b
es lo mismo quea = a & b
.fuente
Encontré una situación similar usando booleanos donde quería evitar llamar a b () si a ya era falso.
Esto funcionó para mí:
fuente
a=a&&b()
.