Condividi tramite


Operatori di assegnazione

Sintassi

expression assignment-operator expression

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

Osservazioni:

Gli operatori di assegnazione archiviano un valore nell'oggetto specificato dall'operando sinistro. Esistono due tipi di operazioni di assegnazione:

  • assegnazione semplice, in cui il valore del secondo operando viene archiviato nell'oggetto specificato dal primo operando.

  • assegnazione composta, in cui viene eseguita un'operazione aritmetica, shift o bit per bit prima di archiviare il risultato.

Tutti gli operatori di assegnazione nella tabella seguente, ad eccezione dell'operatore = , sono operatori di assegnazione composti.

Tabella operatori di assegnazione

Operatore Significato
= Archiviare il valore del secondo operando nell'oggetto specificato dal primo operando (assegnazione semplice).
*= Moltiplicare il valore del primo operando per il valore del secondo operando; archiviare il risultato nell'oggetto specificato dal primo operando.
/= Dividere il valore del primo operando per il valore del secondo operando; archiviare il risultato nell'oggetto specificato dal primo operando.
%= Accetta modulo del primo operando specificato dal valore del secondo operando; archiviare il risultato nell'oggetto specificato dal primo operando.
+= Aggiungere il valore del secondo operando al valore del primo operando; archiviare il risultato nell'oggetto specificato dal primo operando.
-= Sottrarre il valore del secondo operando dal valore del primo operando; archiviare il risultato nell'oggetto specificato dal primo operando.
<<= Spostare il valore del primo operando a sinistra del numero di bit specificato dal valore del secondo operando; archiviare il risultato nell'oggetto specificato dal primo operando.
>>= Spostare il valore del primo operando a destra il numero di bit specificato dal valore del secondo operando; archiviare il risultato nell'oggetto specificato dal primo operando.
&= Ottenere l'AND bit per bit del primo e del secondo operando; archiviare il risultato nell'oggetto specificato dal primo operando.
^= Ottenere l'OR esclusivo bit per bit del primo e del secondo operando; archiviare il risultato nell'oggetto specificato dal primo operando.
|= Ottenere l'OR inclusivo bit per bit del primo e del secondo operando; archiviare il risultato nell'oggetto specificato dal primo operando.

Parole chiave dell'operatore

Tre degli operatori di assegnazione composta hanno equivalenti di parole chiave. Sono:

Operatore Equivalente
&= and_eq
|= or_eq
^= xor_eq

C++ specifica queste parole chiave dell'operatore come ortografie alternative per gli operatori di assegnazione composta. In C, le ortografie alternative vengono fornite come macro nell'intestazione <iso646.h> . In C++, le ortografie alternative sono parole chiave; l'uso di <iso646.h> o del ciso646> equivalente <C++ è deprecato. In Microsoft C++, l'opzione del /permissive- compilatore o /Za è necessaria per abilitare l'ortografia alternativa.

Esempio

// 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;
}

Assegnazione semplice

L'operatore di assegnazione semplice (=) determina l'archiviazione del valore del secondo operando nell'oggetto specificato dal primo operando. Se entrambi gli oggetti sono di tipi aritmetici, l'operando destro viene convertito nel tipo di sinistra, prima di archiviare il valore.

Gli oggetti di e possono const essere assegnati a l-values di tipi che sono solo volatile, o che non const sono o volatile.volatile

L'assegnazione a oggetti di tipo classe (struct, unione class tipi) viene eseguita da una funzione denominata operator=. Il comportamento predefinito di questa funzione operatore consiste nell'eseguire un'assegnazione di copia a livello di membro dei membri dati non statici dell'oggetto e classi di base dirette; Tuttavia, questo comportamento può essere modificato usando operatori di overload. Per ulteriori informazioni, vedere Sovraccarico degli operatori. I tipi di classe possono anche avere operatori di assegnazione di copia e assegnazione di spostamento . Per altre informazioni, vedere Copiare costruttori e operatori di assegnazione di copia e costruttori di spostamento e operatori di assegnazione di spostamento.

Un oggetto di qualsiasi classe derivata senza ambiguità da una determinata classe di base può essere assegnato a un oggetto della classe base. Il contrario non è vero perché è presente una conversione implicita dalla classe derivata alla classe base, ma non dalla classe base alla classe derivata. Per esempio:

// 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
}

Le assegnazioni ai tipi di riferimento si comportano come se l'assegnazione venisse effettuata all'oggetto a cui puntano i riferimenti.

Per gli oggetti di tipo classe, l'assegnazione è diversa dall'inizializzazione. Per illustrare come possono essere diverse assegnazioni e inizializzazione, prendere in considerazione il codice

UserType1 A;
UserType2 B = A;

Il codice precedente mostra un inizializzatore; chiama il costruttore per UserType2 che accetta un argomento di tipo UserType1. Dato il codice

UserType1 A;
UserType2 B;

B = A;

istruzione di assegnazione

B = A;

può avere uno degli effetti seguenti:

  • Chiamare la funzione operator= per UserType2, fornito operator= con un UserType1 argomento .

  • Chiamare la funzione UserType1::operator UserType2di conversione esplicita , se tale funzione esiste.

  • Chiamare un costruttore UserType2::UserType2, purché esista un costruttore di questo tipo, che accetta un UserType1 argomento e copia il risultato.

Assegnazione composta

Gli operatori di assegnazione composta sono visualizzati nella tabella Operatori di assegnazione. Questi operatori hanno il formato e1op= e2, dove e1 è un l-value nonconst modificabile e e2 è:

  • un tipo aritmetico

  • un puntatore, se op è + o -

  • un tipo per il quale esiste un overload corrispondente operator *op*= per il tipo di e1

Il modulo e1op= e2 predefinito si comporta come e1=e1ope2, ma e1 viene valutato una sola volta.

L'assegnazione composta a un tipo enumerato genera un messaggio di errore. Se l'operando sinistro è di un tipo puntatore, l'operando destro deve essere di un tipo puntatore oppure deve essere un'espressione costante che restituisce 0. Quando l'operando sinistro è di un tipo integrale, l'operando destro non deve essere di un tipo puntatore.

Risultato degli operatori di assegnazione predefiniti

Gli operatori di assegnazione predefiniti restituiscono il valore dell'oggetto specificato dall'operando sinistro dopo l'assegnazione (e l'operazione aritmetica/logica nel caso di operatori di assegnazione composti). Il tipo risultante è il tipo dell'operando sinistro. Il risultato di un'espressione di assegnazione è sempre un valore l. Questi operatori hanno associatività da destra a sinistra. L'operando sinistro deve essere un l-value modificabile.

In ANSI C il risultato di un'espressione di assegnazione non è un l-value. Ciò significa che l'espressione (a += b) += c C++ legale non è consentita in C.

Vedere anche

Espressioni con operatori binari
Operatori, precedenza e associatività predefiniti C++
Operatori di assegnazione C