Operadores de asignación compuestos en Java

Los operadores de asignación compuesta proporcionan una sintaxis más corta para asignar el resultado de un operador aritmético o bit a bit. Realizan la operación en los dos operandos antes de asignar el resultado al primer operando.
Los siguientes son todos los posibles operadores de asignación en Java:

1.    += (compound addition assignment operator)
2.    -=  (compound subtraction assignment operator)
3.    *= (compound multiplication assignment operator)
4.    /= (compound division assignment operator)
5.    %= (compound modulo assignment operator)
6.    &= (compound Bitwise & assignment operator)
7.    |= (compound Bitwise | assignment operator)
8.    ^= (compound Bitwise ^ assignment operator)
9.    >>= (compound right-shift assignment operator)
10.    >>>=(compound right-shift filled 0 assignment operator)
11.    <<=(compound left-shift assignment operator)

Implementación de todos los operadores de asignación compuestos

// Java program to illustrate
// Compound assignment operators
class Main {
public static void main(String args[])
    {
        byte b = 120;
        b += 10;
        byte b1 = 120;
        b1 *= 10;
        short s = 330;
        s -= 30;
        byte b2 = 127;
        b2 %= 7;
        byte b3 = 120;
        b3 &= 40;
        short s1 = 300;
        s1 ^= 100;
        byte b4 = 127;
        b4 >>= 3;
        short s2 = 200;
        s2 <<= 3;
        short s3 = 300;
        s3 >> >= 4;
        System.out.println(b);
        System.out.println(b1);
        System.out.println(b2);
        System.out.println(b3);
        System.out.println(b4);
        System.out.println(s);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }
}

Producción:

-126
-80
1
40
15
300
328
1600
18

Reglas para resolver los operadores de asignación compuesta

En tiempo de ejecución, la expresión se evalúa de una de dos maneras. Según las condiciones de programación:

  1. Si la expresión del operando de la izquierda no es una expresión de acceso a la array, entonces:
    • Primero, el operando de la izquierda se evalúa para producir una variable. Si esta evaluación se completa abruptamente, entonces la expresión de asignación se completa abruptamente por la misma razón; el operando de la derecha no se evalúa y no se produce ninguna asignación.
    • De lo contrario, se guarda el valor del operando de la izquierda y luego se evalúa el operando de la derecha. Si esta evaluación se completa abruptamente, entonces la expresión de asignación se completa abruptamente por la misma razón y no ocurre ninguna asignación.
    • De lo contrario, el valor guardado de la variable de la izquierda y el valor del operando de la derecha se utilizan para realizar la operación binaria indicada por el operador de asignación compuesto. Si esta operación se completa abruptamente, entonces la expresión de asignación se completa abruptamente por la misma razón y no ocurre ninguna asignación.
    • De lo contrario, el resultado de la operación binaria se convierte al tipo de la variable de la izquierda, se somete a la conversión del conjunto de valores al conjunto de valores estándar apropiado y el resultado de la conversión se almacena en la variable.
  2. Si la expresión del operando de la izquierda es una expresión de acceso a la array, entonces:
    • En primer lugar, se evalúa la subexpresión de referencia de array de la expresión de acceso a la array de operandos de la izquierda. Si esta evaluación se completa abruptamente, entonces la expresión de asignación se completa abruptamente por la misma razón; la subexpresión de índice (de la expresión de acceso a la array de operandos de la izquierda) y el operando de la derecha no se evalúan y no se produce ninguna asignación.
    • De lo contrario, se evalúa la subexpresión de índice de la expresión de acceso a la array de operandos de la izquierda. Si esta evaluación se completa abruptamente, entonces la expresión de asignación se completa abruptamente por la misma razón y el operando de la derecha no se evalúa y no ocurre ninguna asignación.
    • De lo contrario, si el valor de la subexpresión de referencia de la array es nulo, no se produce ninguna asignación y se lanza una NullPointerException.
    • De lo contrario, el valor de la subexpresión de referencia de la array de hecho se refiere a una array. Si el valor de la subexpresión de índice es menor que cero, o mayor o igual que la longitud de la array, no se realiza ninguna asignación y se genera una ArrayIndexOutOfBoundsException.
    • De lo contrario, el valor de la subexpresión de índice se utiliza para seleccionar un componente de la array a la que hace referencia el valor de la subexpresión de referencia de la array. El valor de este componente se guarda y luego se evalúa el operando de la derecha. Si esta evaluación se completa abruptamente, entonces la expresión de asignación se completa abruptamente por la misma razón y no ocurre ninguna asignación.

Ejemplos: resolución de declaraciones con operadores de asignación compuestos

Todos sabemos que cada vez que asignamos un valor mayor a una variable de tipo de datos más pequeña, debemos realizar una conversión de tipo explícita para obtener el resultado sin ningún error de tiempo de compilación. Si no realizamos una conversión de tipos explícita, obtendremos un error de tiempo de compilación. Pero en el caso de los operadores de asignación compuesta, la conversión de tipo interna se realizará automáticamente, incluso si estamos asignando un valor mayor a una variable de tipo de datos más pequeña, pero puede haber una posibilidad de pérdida de información de datos. El programador no será responsable de realizar una conversión de tipos explícita. Veamos el siguiente ejemplo para encontrar la diferencia entre el operador de asignación normal y el operador de asignación compuesto.
Una expresión de asignación compuesta de la forma E1 op= E2 es equivalente a E1 = (T) ((E1) op (E2)), donde T es el tipo de E1, excepto que E1 se evalúa solo una vez.

Por ejemplo, el siguiente código es correcto:

short x = 4;
x += 6.6;

y da como resultado que x tenga el valor 7 porque es equivalente a:

short x = 4;
x = (short)(x + 6.6);
x=10

Porque aquí 6.6, que es doble, se convierte automáticamente a tipo corto sin conversión de tipos explícita.

Consulte: ¿Cuándo se requiere la conversión de tipo?

// Java program to illustrate the
// behavior of normal addition operator
public class Test {
public static void main(String[] args)
    {
        // Normal assignment operator
        byte b = 10;
        b = b + 10;
        System.out.println(b);
    }
}

Producción:

error: incompatible types: possible lossy conversion from int to byte

Explicación: En el ejemplo anterior, estamos usando un operador de asignación normal. Aquí estamos asignando un valor int (b+1=20) a la variable de bytes (es decir, b) que da como resultado un error de tiempo de compilación. Aquí tenemos que hacer una conversión de tipos para obtener el resultado.

// Java program to illustrate the
// behavior of compound addition assignment operator
public class Test {
public static void main(String[] args)
    {
        // compound assignment operator
        byte b = 10;
        b += 10;
        System.out.println(b);
    }
}

Producción:

20

Explicación: En el ejemplo anterior, estamos usando un operador de asignación compuesto. Aquí estamos asignando un valor int (b+1=20) a la variable de byte (es decir, b), aparte de eso, obtenemos el resultado como 20 porque la compilación realiza automáticamente la conversión de tipo del operador de asignación compuesta. Aquí no tenemos que hacer una conversión de tipos para obtener el resultado.

// Java program to illustrate the
// behavior of normal multiplication operator
public class Test {
public static void main(String[] args)
    {
        // Normal multiplication operator
        short s = 1270;
        s = s * 100;
        System.out.println(s);
    }
}

Producción:

Error: incompatible types: possible lossy conversion from int to short
// Java program to illustrate the
// behavior of compound multiplication operator
public class Test {
public static void main(String[] args)
    {
        // Compound multiplication operator
        short s = 1270;
        s *= 100;
        System.out.println(s);
    }
}

Producción:

-4072
// Java program to illustrate the
// behavior of normal addition operator on float
public class Test {
public static void main(String[] args)
    {
        // Normal addition operator
        float f = 1270.00f;
        f = f + 127.00;
        System.out.println(f);
    }
}

Producción:

error: incompatible types: possible lossy conversion from double to float
// Java program to illustrate the
// behavior of compound addition operator on float
public class Test {
public static void main(String[] args)
    {
        // Compound addition operator
        float f = 1270.00f;
        f += 127.00;
        System.out.println(f);
    }
}

Producción:

1397.0

Referencia: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

Este artículo es una contribución de Bishal Kumar Dubey . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *