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= E2es equivalente aE1 = (T)((E1) op (E2)), dondeTes el tipo deE1, excepto queE1se 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 btiene que ser booleany 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 bes una variable o una constante, el resultado será el mismo para ambas versiones. Solo hay una diferencia semántica cuando bhay 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 by 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 bno 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¶ 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
bes una, primitivoa = a && b,a = a & bya &= btodos 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 &= bes 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().