Share via


Operatori di assegnazione

Sintassi

expression assignment-operator expression

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

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
= Memorizza il valore del secondo operando nell'oggetto specificato dal primo operando (assegnamento semplice).
*= Moltiplica il valore del primo operando per il valore del secondo operando e memorizza il risultato nell'oggetto specificato dal primo operando.
/= Divide il valore del primo operando per il valore del secondo operando e memorizza il risultato nell'oggetto specificato dal primo operando.
%= Calcola il modulo del primo operando specificato per il valore del secondo operando e memorizza il risultato nell'oggetto specificato dal primo operando.
+= Somma il valore del secondo operando al valore del primo operando e memorizza il risultato nell'oggetto specificato dal primo operando.
-= Sottrae il valore del secondo operando dal valore del primo operando e memorizza il risultato nell'oggetto specificato dal primo operando.
<<= Esegue uno spostamento a sinistra del valore del primo operando di un numero di bit specificati dal valore del secondo operando e memorizza il risultato nell'oggetto specificato dal primo operando.
>>= Esegue uno spostamento a destra del valore del primo operando di un numero di bit specificati dal valore del secondo operando e memorizza il risultato nell'oggetto specificato dal primo operando.
&= Ottiene l'AND bit per bit del primo e del secondo operando e memorizza il risultato nell'oggetto specificato dal primo operando.
^= Ottiene l'OR esclusivo bit per bit del primo e del secondo operando e memorizza il risultato nell'oggetto specificato dal primo operando.
|= Ottiene l'OR inclusivo bit per bit del primo e del secondo operando e memorizza 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 singola

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 altre informazioni, vedere Overload 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 senza alcuna ambiguità di classe derivata da una classe base specificata 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. Ad 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 cui punta il riferimento.

Per gli oggetti di tipo classe, l'assegnazione è diversa dall'inizializzazione. Per illustrare come possono essere diverse l'assegnazione e l'inizializzazione, si consideri 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;

l'istruzione di assegnazione

B = A;

può avere uno dei seguenti effetti:

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

  • Chiamare la funzione esplicita UserType1::operator UserType2 di conversione, se tale funzione non esiste.

  • Chiamare un costruttore UserType2::UserType2, se tale costruttore esiste, che accetta un argomento UserType1 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 l-value. Questi operatori hanno un'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.

Vedi anche

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