Operații de atribuire
Operațiile de atribuire permit atribuirea unei valori. Aceste operații se efectuează asupra a doi operanzi, iar operandul din stânga poate reprezenta doar o expresie denumită modificabilă, de exemplu, o variabilă.
Operația de atribuire de bază = permite atribuirea valorii operandului din dreapta operandului din stânga:
int x {};
x = 2;
Adică, în acest caz, variabila x (operandul din stânga) va avea valoarea 2 (operandul din dreapta).
Trebuie menționat că tipul valorii operandului din dreapta nu coincide întotdeauna cu tipul operandului din stânga. În acest caz, compilatorul încearcă să convertească valoarea operandului din dreapta la tipul operandului din stânga.
În același timp, operațiile de atribuire au un ordin de evaluare de la dreapta la stânga, adică se execută de la dreapta spre stânga. Astfel, se poate efectua o atribuire multiplă:
int a {}, b{}, c{};
a = b = c = 34;
Aici se evaluează mai întâi expresia c = 34. Valoarea operandului din dreapta – 34 – este atribuită operandului din stânga c. Apoi se evaluează expresia b = c: valoarea operandului din dreapta c (34) este atribuită operandului din stânga b. Și la final se evaluează expresia a = b: valoarea operandului din dreapta b (34) este atribuită operandului din stânga a.
În plus, trebuie menționat că operațiile de atribuire au cea mai mică prioritate în comparație cu alte tipuri de operații, așadar sunt executate ultimele:
int x {};
x = 3 + 5;
În conformitate cu prioritatea operațiilor, mai întâi se execută expresia 3 + 5, și abia apoi valoarea sa este atribuită variabilei x.
Toate celelalte operații de atribuire sunt combinații ale operației simple de atribuire cu alte operații și au forma generală op=:
- +=: atribuire după adunare. Atribuie operandului din stânga suma dintre operandul din stânga și operandul din dreapta: A += B este echivalent cu A = A + B.
- -=: atribuire după scădere. Atribuie operandului din stânga diferența dintre operandul din stânga și operandul din dreapta: A -= B este echivalent cu A = A - B.
- *=: atribuire după înmulțire. Atribuie operandului din stânga produsul operandului din stânga și operandului din dreapta: A *= B este echivalent cu A = A * B.
- /=: atribuire după împărțire. Atribuie operandului din stânga câtul împărțirii operandului din stânga la operandul din dreapta: A /= B este echivalent cu A = A / B.
- %=: atribuire după împărțirea modulo. Atribuie operandului din stânga restul împărțirii întregi a operandului din stânga la operandul din dreapta: A %= B este echivalent cu A = A % B.
- <<=: atribuire după deplasarea bit cu bit la stânga. Atribuie operandului din stânga rezultatul deplasării reprezentării sale binare spre stânga cu un număr de poziții egal cu valoarea operandului din dreapta: A <<= B este echivalent cu A = A << B.
- >>=: atribuire după deplasarea bit cu bit la dreapta. Atribuie operandului din stânga rezultatul deplasării reprezentării sale binare spre dreapta cu un număr de poziții egal cu valoarea operandului din dreapta: A >>= B este echivalent cu A = A >> B.
- &=: atribuire după conjuncția pe biți (AND). Atribuie operandului din stânga rezultatul operației de conjuncție pe biți între reprezentarea sa binară și cea a operandului din dreapta: A &= B este echivalent cu A = A & B.
- |=: atribuire după disjuncția pe biți (OR). Atribuie operandului din stânga rezultatul operației de disjuncție pe biți între reprezentarea sa binară și cea a operandului din dreapta: A |= B este echivalent cu A = A | B.
- ^=: atribuire după operația XOR (exclusiv OR). Atribuie operandului din stânga rezultatul operației de XOR între reprezentarea sa binară și cea a operandului din dreapta: A ^= B este echivalent cu A = A ^ B.
Exemple de operații:
#include <iostream>
int main()
{
int a {5};
a += 10; // 15
a -= 3; // 12
a *= 2; // 24
a /= 6; // 4
a <<= 4; // 64
a >>= 2; // 16
std::cout << "a = " << a << std::endl;
}