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
, union
e 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=
perUserType2
, fornitooperator=
con unUserType1
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 argomentoUserType1
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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per