pakoré
Asumiendo
boolean a = false;
Me preguntaba si haciendo:
a &= b;
es equivalente a
a = a && b; //logical AND, a is false hence b is not evaluated.
o por el contrario significa
a = a & b; //Bitwise AND. Both a and b are evaluated.
esteban c
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))
dóndeT
es el tipo deE1
excepto esoE1
se evalúa una sola vez.
Asi que a &= b;
es equivalente a a = a & b;
.
(En algunos usos, el tipo de conversión hace una diferencia en el resultado, pero en este b
tiene que ser boolean
y el type-cast no hace nada.)
Y, para que conste, a &&= b;
no es Java válido. 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. Sólo hay una diferencia semántica cuando b
es una subexpresión que tiene efectos secundarios. En el &
caso, el efecto secundario siempre ocurre. En el &&
caso se produzca dependiendo del valor de a
.)
Por el lado del desempeño, la compensación es entre el costo de evaluar b
y el costo de una prueba y 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 es trivial, la diferencia de rendimiento entre las dos versiones es demasiado pequeña para que valga la pena considerarla.
guiso
ver 15.22.2 del JLS. Para operandos booleanos, el &
operador es booleano, no bit a bit. La única diferencia entre &&
y &
para operandos booleanos es que para &&
está en cortocircuito (lo que significa que el segundo operando no se evalúa si el primer operando se evalúa como falso).
Entonces, en tu caso, si b
es un primitivo, a = a && b
, a = a & b
y a &= b
todos hacen lo mismo.
-
Entonces (a &= b;) ¿no se producirá un cortocircuito si b es una llamada de método? ¿Hay algo como un operador “&&=”?
– is7s
25 de abril de 2012 a las 18:34
-
Parece que esto no responde a la pregunta; el OP ya sabía sobre el cortocircuito.
– O Mapeador
15 de noviembre de 2012 a las 7:58
es el ultimo:
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 mencionaron otros, a &= b
es lo mismo que a = a & b
.
daniel testa
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()
-
Para evitar redundancias (todavía permitiendo cortocircuitos), simplemente puede escribir
a=a&&b()
.– Unai Vivi
8 de septiembre de 2012 a las 9:39
-
Para evitar redundancias (todavía permitiendo cortocircuitos), simplemente puede escribir
a=a&&b()
.– Unai Vivi
8 de septiembre de 2012 a las 9:39