Compartir a través de


Operadores de asignación

Sintaxis

expression assignment-operator expression

assignment-operator: uno de
=*=/=%=+=-=<<=>>=&=^=|=

Observaciones

Los operadores de asignación almacenan un valor en el objeto especificado por el operando izquierdo. Hay dos tipos de operaciones de asignación:

  • asignación simple, en la que el valor del segundo operando se almacena en el objeto especificado por el primer operando.

  • asignación compuesta, en la que se realiza una operación aritmética, desplazamiento o bit a bit antes de almacenar el resultado.

Todos los operadores de asignación de la tabla siguiente, excepto el = operador, son operadores de asignación compuestos.

Tabla de operadores de asignación

Operador Significado
= Almacene el valor del segundo operando en el objeto especificado por el primer operando (asignación simple).
*= Multiplique el valor del primer operando por el valor del segundo operando; almacenar el resultado en el objeto especificado por el primer operando.
/= Divida el valor del primer operando por el valor del segundo operando; almacenar el resultado en el objeto especificado por el primer operando.
%= Tome módulo del primer operando especificado por el valor del segundo operando; almacenar el resultado en el objeto especificado por el primer operando.
+= Agregue el valor del segundo operando al valor del primer operando; almacenar el resultado en el objeto especificado por el primer operando.
-= Resta el valor del segundo operando del valor del primer operando; almacenar el resultado en el objeto especificado por el primer operando.
<<= Cambie el valor del primer operando a la izquierda del número de bits especificado por el valor del segundo operando; almacenar el resultado en el objeto especificado por el primer operando.
>>= Cambie el valor del primer operando a la derecha el número de bits especificado por el valor del segundo operando; almacenar el resultado en el objeto especificado por el primer operando.
&= Obtenga el AND bit a bit de los operandos primero y segundo; almacenar el resultado en el objeto especificado por el primer operando.
^= Obtenga el OR exclusivo bit a bit de los operandos primero y segundo; almacenar el resultado en el objeto especificado por el primer operando.
|= Obtenga el OR inclusivo bit a bit de los operandos primero y segundo; almacenar el resultado en el objeto especificado por el primer operando.

Palabras clave del operador

Tres de los operadores de asignación compuesta tienen equivalentes de palabra clave. Son las siguientes:

Operador Tipo de datos de XPath
&= and_eq
|= or_eq
^= xor_eq

C++ especifica estas palabras clave de operador como ortografías alternativas para los operadores de asignación compuesta. En C, las ortografías alternativas se proporcionan como macros en el <encabezado iso646.h> . En C++, las ortografías alternativas son palabras clave; uso de <iso646.h> o el ciso646> equivalente <de C++ está en desuso. En Microsoft C++, se requiere la /permissive- opción del compilador o /Za para habilitar la ortografía alternativa.

Ejemplo

// expre_Assignment_Operators.cpp
// compile with: /EHsc
// Demonstrate assignment operators
#include <iostream>
using namespace std;
int main() {
   int a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555;

   a += b;      // a is 9
   b %= a;      // b is 6
   c >>= 1;      // c is 5
   d |= e;      // Bitwise--d is 0xFFFF

   cout  << "a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555" << endl
         << "a += b yields " << a << endl
         << "b %= a yields " << b << endl
         << "c >>= 1 yields " << c << endl
         << "d |= e yields " << hex << d << endl;
}

Asignación sencilla

El operador de asignación simple (=) hace que el valor del segundo operando se almacene en el objeto especificado por el primer operando. Si ambos objetos son de tipos aritméticos, el operando derecho se convierte en el tipo de la izquierda, antes de almacenar el valor.

Los objetos de const y se pueden asignar a valores L de tipos que son solo volatile, o que no const son o volatilevolatile .

La asignación a objetos de tipo de clase (struct, uniony class tipos) se realiza mediante una función denominada operator=. El comportamiento predeterminado de esta función de operador es realizar una asignación de copia basada en miembros de los miembros de datos no estáticos del objeto y clases base directas; sin embargo, este comportamiento se puede modificar mediante operadores sobrecargados. Para obtener más información, consulte Sobrecarga del operador. Los tipos de clase también pueden tener operadores de asignación de copia y de movimiento . Para obtener más información, vea Copiar constructores y operadores de asignación de copia y Mover constructores y operadores de asignación de movimiento.

Un objeto de cualquier clase derivada inequívocamente de una clase base determinada se puede asignar a un objeto de la clase base. La inversa no es true porque hay una conversión implícita de la clase derivada a la clase base, pero no de la clase base a la clase derivada. Por ejemplo:

// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class ABase
{
public:
    ABase() { cout << "constructing ABase\n"; }
};

class ADerived : public ABase
{
public:
    ADerived() { cout << "constructing ADerived\n"; }
};

int main()
{
    ABase aBase;
    ADerived aDerived;

    aBase = aDerived; // OK
    aDerived = aBase; // C2679
}

Las asignaciones para hacer referencia a tipos se comportan como si se realizara la asignación al objeto al que apunta la referencia.

En el caso de los objetos de tipo clase, la asignación es diferente de la inicialización. Para ilustrar cómo puede ser la asignación y la inicialización diferentes, considere el código.

UserType1 A;
UserType2 B = A;

El código anterior muestra un inicializador; llama al constructor para UserType2 que toma un argumento de tipo UserType1. Dado el código

UserType1 A;
UserType2 B;

B = A;

la instrucción de asignación

B = A;

puede tener uno de los siguientes efectos:

  • Llame a la función operator= para UserType2, proporcionado operator= con un UserType1 argumento .

  • Llame a la función UserType1::operator UserType2de conversión explícita , si existe dicha función.

  • Llame a un constructor UserType2::UserType2, siempre que exista este constructor, que toma un UserType1 argumento y copia el resultado.

Asignación compuesta

Los operadores de asignación compuesta se muestran en la tabla Operadores de asignación. Estos operadores tienen la forma e1op= e2, donde e1 es un valor l noconst modificable y e2 es:

  • un tipo aritmético

  • un puntero, si op es + o -

  • un tipo para el que existe una sobrecarga coincidente operator *op*= para el tipo de e1

El formulario e1op= e2 integrado se comporta como e1 e1=ope2, pero e1 se evalúa solo una vez.

La asignación compuesta a un tipo enumerado genera un mensaje de error. Si el operando izquierdo es de un tipo de puntero, el operando derecho debe ser de un tipo de puntero o debe ser una expresión constante que se evalúa como 0. Cuando el operando izquierdo es de un tipo entero, el operando derecho no debe ser de un tipo de puntero.

Resultado de operadores de asignación integrados

Los operadores de asignación integrados devuelven el valor del objeto especificado por el operando izquierdo después de la asignación (y la operación aritmética/lógica en el caso de operadores de asignación compuestos). El tipo resultante es el tipo del operando izquierdo. El resultado de una expresión de asignación siempre es un valor l. Estos operadores tienen asociatividad de derecha a izquierda. El operando izquierdo debe ser un valor L modificable.

En ANSI C, el resultado de una expresión de asignación no es un valor L. Esto significa que no se permite la expresión (a += b) += c de C++ legal en C.

Consulte también

Expresiones con operadores binarios
Operadores integrados de C++, precedencia y asociatividad
Operadores de asignación de C