¿Se aplica el operador &= de Java & o &&?

3 minutos de lectura

avatar de usuario
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.

avatar de usuario
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 a E1 = (T)((E1) op (E2))dónde T es el tipo de E1excepto eso E1 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 by el costo de una prueba y rama del valor de ay 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.

avatar de usuario
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 & by 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 calledpor lo tanto, se evalúa el operando de la derecha.

Entonces, como ya mencionaron otros, a &= b es lo mismo que a = a & b.

avatar de usuario
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

¿Ha sido útil esta solución?