C Language Operadores de Asignación


Ejemplo

Asigna el valor del operando de la derecha a la ubicación de almacenamiento nombrada por el operando de la izquierda y devuelve el valor.

int x = 5;      /* Variable x holds the value 5. Returns 5. */ 
char y = 'c';   /* Variable y holds the value 99. Returns 99 
                 * (as the character 'c' is represented in the ASCII table with 99).
                 */
float z = 1.5;  /* variable z holds the value 1.5. Returns 1.5. */
char const* s = "foo"; /* Variable s holds the address of the first character of the string 'foo'. */

Varias operaciones aritméticas tienen un operador de asignación compuesto .

a += b  /* equal to: a = a + b */
a -= b  /* equal to: a = a - b */
a *= b  /* equal to: a = a * b */
a /= b  /* equal to: a = a / b */
a %= b  /* equal to: a = a % b */
a &= b  /* equal to: a = a & b */
a |= b  /* equal to: a = a | b */
a ^= b  /* equal to: a = a ^ b */
a <<= b /* equal to: a = a << b */
a >>= b /* equal to: a = a >> b */

Una característica importante de estas asignaciones compuestas es que la expresión en el lado izquierdo ( a ) solo se evalúa una vez. Por ejemplo, si p es un puntero

*p += 27;

desreferencias p solo una vez, mientras que lo siguiente lo hace dos veces.

*p = *p + 27;

También se debe tener en cuenta que el resultado de una asignación como a = b es lo que se conoce como un valor de r . Por lo tanto, la asignación realmente tiene un valor que luego se puede asignar a otra variable. Esto permite el encadenamiento de asignaciones para establecer múltiples variables en una sola declaración.

Este valor puede usarse en las expresiones de control de las sentencias if (o bucles o sentencias de switch ) que guardan algún código en el resultado de otra expresión o llamada de función. Por ejemplo:

char *buffer;
if ((buffer = malloc(1024)) != NULL)
{
    /* do something with buffer */
    free(buffer);
}
else
{
    /* report allocation failure */
}

Debido a esto, se debe tener cuidado para evitar un error tipográfico común que puede conducir a errores misteriosos.

int a = 2;
/* ... */
if (a = 1)
    /* Delete all files on my hard drive */

Esto tendrá resultados desastrosos, ya que a = 1 siempre se evaluará como 1 y, por lo tanto, la expresión de control de la sentencia if siempre será verdadera (lea más sobre este escollo común aquí ). El autor casi seguramente quiso usar el operador de igualdad ( == ) como se muestra a continuación:

int a = 2;
/* ... */
if (a == 1)
    /* Delete all files on my hard drive */

Asociatividad de operadores

int a, b = 1, c = 2;
a = b = c;

Esto asigna c a b , que devuelve b , que es lo que se asigna a a . Esto sucede porque todos los operadores de asignación tienen asociatividad derecha, lo que significa que la operación más a la derecha en la expresión se evalúa primero, y procede de derecha a izquierda.