Operaciones de modificación

La modificación, que también se denomina asignación compuesta, permite combinar dentro de un operador operaciones aritméticas o a nivel de bits con operaciones de asignación normales.

P

Símbolos

Descripción

Ejemplo

Orden de ejecución

14

+=

Suma con asignación

e1 += e2

D-I

14

-=

Resta con asignación

e1 -= e2

D-I

14

*=

Multiplicación con asignación

e1 *= e2

D-I

14

/=

División con asignación

e1 /= e2

D-I

14

%=

Módulo de división con asignación

e1 %= e2

D-I

14

<<=

Desplazamiento a la izquierda con asignación

e1 <<= e2

D-I

14

>>=

Desplazamiento a la derecha con asignación

e1 >>= e2

D-I

14

&=

AND a nivel de bits con asignación

e1 &= e2

D-I

14

|=

OR a nivel de bits con asignación

e1 |= e2

D-I

14

^=

AND/OR a nivel de bits con asignación

e1 ^= e2

D-I

Estos operadores ejecutan la acción pertinente para los operandos e1 y e2, tras lo cual el resultado se almacena en e1.

Una expresión como e1 @= e2, donde @ es cualquier operador de la tabla, es equivalente aproximadamente a e1 = e1 @ e2. La palabra «aproximadamente» subraya la presencia de algunos aspectos sutiles.

En primer lugar, si el lugar de e2 está ocupado por una expresión con un operador de prioridad inferior a la de @, e2 sigue calculándose antes que ella. Es decir, si la prioridad está marcada con paréntesis, obtendremos e1 = e1 @ (e2).

En segundo lugar, si hay modificaciones laterales de variables en la expresión e1, sólo se realizan una vez. El siguiente ejemplo se ofrece la demostración.

int a[] = {12345};
int b[] = {12345};
int i = 0j = 0;
a[++i] *= i + 1;           // a = {1, 4, 3, 4, 5}, i = 1
                           // not equivalent!
b[++j] = b[++j] * (j + 1); // b = {1, 2, 4, 4, 5}, j = 2

En este caso, los arrays a y b contienen elementos idénticos y se procesan mediante las variables de índice i y j. Al mismo tiempo, la expresión para el array a utiliza la operación '*=', mientras que la del array b utiliza la equivalente. Los resultados no son iguales: tanto las variables de índice como los arrays difieren.

Otros operadores serán útiles en problemas con manipulaciones a nivel de bits. Así, la siguiente expresión se puede utilizar para establecer un bit específico en 1:

ushort x = 0;
x |= 1 << 10;

Aquí, el desplazamiento 1 ('0000 0000 0000 0001') se realiza 10 bits a la izquierda, con lo que se obtiene un número con un 10º bit ajustado ('0000 0100 0000 0000'). La operación OR a nivel de bits copia este bit en la variable x.

Para reiniciar el mismo bit, escribiremos:

x &= ~(1 << 10);

Aquí, la operación de inversión se aplica a 1 desplazado 10 bits a la izquierda (que ya vimos en la expresión anterior), lo que hace que todos los bits cambien de valor: '1111 1011 1111 1111'. La operación AND a nivel de bit restablece los bits a cero (en este caso, uno) en la variable x, mientras que el resto de bits de x permanecen inalterados.