Respuestas:
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, primitivo a = a && b
, a = a & b
y a &= b
todos hacen lo mismo.
Es el último:
a = a & b;
Aquí hay una manera simple de probarlo:
public class OperatorTest {
public static void main(String[] args) {
boolean a = false;
a &= b();
}
private static boolean b() {
System.out.println("b() was called");
return true;
}
}
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 que a = a & b
.
Encontré una situación similar usando booleanos donde quería evitar llamar a b () si a ya era falso.
Esto funcionó para mí:
a &= a && b()
a=a&&b()
.