No considero que sea necesario realizar algun ejercicio en C++ para explicar el funcionamiento de los operadores de asignación ya que es un contenido relativamente fácil como asignarle el valor de 5 a una variable x. X=5
Lo que si considero de mucha importancia es que quede bien claro lo que son, como y donde se utilizan cada uno y por eso mismo dejare la información debajo para que no te quede ninguna duda y los entiendas a la perfección.
El operador asignación copia modifica el contenido del objeto a por una copia del contenido de a (b no se modifica). Para los tipos clase, es una función miembro especial, descrita en operador de asignación copia.
El operador “asignación de movimiento” modifica el contenido del objeto a por el contenido de b, evitando copiar si es posible (b puede ser modificado). Para tipos clase, es una función miembro especial, descrita en operador asignación de movimiento. (desde C++11)
Para los tipos no clase, la asignación de copia y movimiento son indistinguibles y se denominan asignación directa.
Los operadores de asignación compuesta modifican el contenido del objeto a con el resultado de la operación binaria entre el valor anterior de a y el valor de b.
= Asignación *= Asigna producto /= Asigna división %= Asigna resto (módulo) += Asigna suma -= Asigna diferencia (resta) <<= Asigna desplazamiento izquierda >>= Asigna desplazamiento derecha &= Asigna AND entre bits ^= Asigna XOR entre bits |= Asigna OR entre bits
x = 3; x += 3; x &= 3;
Todos ellos son operadores binarios, de los cuales, = es el único de asignación simple, los demás son operadores de asignación compuestos. Los seis primeros aceptan operandos de distinto tipo, mientras que los cinco últimos: <<=, >>=, &=, ^= y |=, implican manejo de bits, por lo que sus operandos deben ser tipos int en sus distintas variantes.
Las expresiones de asignación producen un resultado. El tipo resultante es el de la (izquierda); el valor que se aplica es el determinado por (el Rvalue. El valor resultante de después de la asignación, es el resultado de la expresión (el Lvalue). Así pues, cualquiera que sea su sentido concreto, todos implican la "copia" de un bloque de memoria (que contiene el "resultado") en algún sitio (la dirección indicada por el Rvalue).
int num; float f = 3.14; num = f + 1;
En este caso, el valor 4.14, resultado de , se aplica a num. Teniendo en cuenta que el tipo resultante debe ser el de num (un int en este caso), se realiza automáticamente una conversión del float 4.14 a int (con pérdida de precisión si es necesario), con el resultado de que num recibe el valor 4 y el resultado de la asignación es un int de valor 4.
Esta propiedad de las asignaciones de producir un resultado, es justamente la que permite expresiones de asignación compuesta del tipo:
A = B = C = D;
Y es ampliamente utilizada en la programación de C++. Considere el bucle del siguiente ejemplo:
while ( (ch = getchar() ) != 27 ) ;
Aprovechando que en este caso, el resultado de la asignación es un char, se utiliza directamente en la cláusula del while, resultando que el bucle se ejecuta indefinidamente hasta que se pulse la tecla ESC (escape).
variable = expresion
La parte izquierda (que tiene que ser un Lvalue no constante) adquiere el valor señalado en la expresión de la derecha, pero se mantiene el tipo original de la variable de la parte izquierda. En caso necesario se realiza una conversión de tipo (con pérdida de precisión en su caso) del izquierdo al derecho. El operador C++ de asignación simple (=) se distingue de otros lenguajes como Pascal que utilizan el símbolo := para este operador. La asignación simple (=) utiliza un símbolo distinto del operador relacional de igualdad (==).
Las variables se pueden inicializar en el mismo momento de la declaración (asignándoles un valor). Este es el único caso en que se puede asignar una constante. Ejemplo:
int primero = 0; char ch = ‘a’; float balance = 123.456; char string[10] = "1234567890"; const float pi = 3.14159 ;
En la expresión E1 = E2, E1 debe ser un Lvalue modificable, en caso contrario puede obtenerse un mensaje de error: Lvalue required. Por ejemplo, una vez declarado char a[10], ninguna de las dos sentencias que siguen es válida:
a = "0123456789"; a[10] = "0123456789";
La expresión de asignación en sí misma no es un Lvalue.
Si @ es un operador compuesto, la expresión E1 @= E2 equivale a E1 = E1 @ E2. Por ejemplo: E1 += E2 equivale a E1 = E1 + E2. Ejemplo
x *= y /* equivalentes */ x = x * y x *= y + 2 /* equivalentes */ x = x * (y + 2)
Tanto para las asignaciones simples como compuestas, ambos operandos E1 y E2 deben cumplir alguna de las siguientes condiciones (asumimos que E1 está a la izquierda del operador y E2 es el de la derecha):
Ejemplos
char* = 0; // asignación de nulo a puntero a carácter char *= 0; // char = char * 0
Es relativamente frecuente confundir el orden de escritura de estos operadores. En todos los casos de asignación compuesta, el símbolo "=" va a la derecha.