Операції присвоєння можна поділити на 2 групи:
1) унарні операції:
a. ++ (постфіксний і префіксний інкремент, збільшення на одиницю),
b. -- (постфіксний і префіксний інкремент, зменшення на одиницю);
2) бінарні операції:
a. = (звичайне присвоєння),
b. *= (множення з присвоєнням),
c. /= (ділення з присвоєнням),
d. %= (остача від ділення з присвоєнням),
e. += (додавання з присвоєнням),
f. -= (віднімання з присвоєнням),
g. &= (побітове І з присвоєнням),
h. ^= (побітове виключне І з присвоєнням),
i. |= (побітове АБО з присвоєнням),
j. <<= (зсування вліво з присвоєнням),
k. >>= (зсування вправо з присвоєнням).
На відміну від інших операцій, операції присвоєння змінюють значення свого операнда: для бінарних операцій лівий операнд набуває значення виразу, записаного справа від знака присвоєння, для унарних операцій – змінюється значення єдиного операнда даної операції. Тому операнд, якому присвоюється значення, повинен бути так званим l-операндом (l-value, left side value) – змінною розадресованим вказівником, тобто він має задавати адресу оперативної пам'яті, куди буде записане значення, яке присвоюється.
Результатом операції присвоєння є значення, яке набуває змінна (l-операнд) після присвоєння. Це значення можна використовувати як операнд у наступних операціях, для яких присвоєння є підвиразом. Операції присвоювання виконуються справа наліво, що дозволяє записати вираз, який складається з декількох присвоєнь (рядок 5 і 7).
1 #include <iostream>
2 using namespace std;
3 int main(){
4 int a, b, c;
5 a = b = c = 123;
6 cout << a << endl; // 123
7 a = b = c + 321;
8 cout << a << endl; // 444
9 }
Бінарні присвоєння стоять у кінці списку пріоритетів, тому іноді підвираз присвоювання слід охоплювати дужками:
#include <iostream>
using namespace std;
int main(){
int a, b = 1, c = 2;
bool r;
r = a = b + c < 2; // 0, a = 3 < 0, a = 0
cout << a << endl;
r = (a = b + c) < 2; // 3
cout << a << endl;
}
Комбіновані присвоєння є окремим випадком звичайних присвоювань. Вираз
операнд1 операція= операнд2;
є скороченим записом операції присвоєння:
операнд1 = операнд1 операція операнд2;
Операція виключне АБО має таку особливість: (a ^ b) ^ b = a. Тобто, якщо виконати операцію 2 рази з однаковим другим операндом, ми отримаємо значення першого операнда. Це дозволяє виконувати обмін двох цілочислових змінних значеннями.
#include <iostream>
using namespace std;
int main(){
int a = 123, b = 321;
a ^= b ^= a ^= b;
cout << "a = " << a << endl; // 321
cout << "b = " << b << endl; // 123
}
В програмах на С++ широко застосовують унарні операції присвоєння ++ і --. Перша з них називається інкрементом, вона збільшує значення операнда на одиницю. Друга – декрементом, зменшує значення операнда на одиницю. Можна застосовувати дві форми запису операцій інкремента і декремента: префіксну, коли знак ++/-- записується перед операндом, і постфіксну – коли знак операції вказується після операнда.
Якщо унарне присвоєння використовується як окремий оператор, то обидві форми запису – префіксна і постфіксна – рівнозначні. В наступному прикладі наведені чотири альтернативні способи збільшення і зменшення значення змінної на одиницю.
#include <iostream>
using namespace std;
int main(){
int a = 0, b = 0;
a++; ++a; a += 1; a = a + 1; // Збільшення на 1
b--; --b; b -= 1; b = b - 1; // Зменшення на 1
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
Різниця між постфіксною і префіксною формами запису проявляється, коли операції інкремента і декремента входять до складу іншого виразу. Префіксний інкремент (декремент) встановлює, що спочатку значення змінної збільшується (зменшується) на одиницю, і після цього нове значення змінної вступає в іншу операцію. Якщо використовується постфіксна форма, то спочатку значення змінної використовується у виразі, потім збільшується (зменшується) на одиниці.
#include <iostream>
using namespace std;
int main(){
int a = 3, b = 3, ta, tb;
ta = ++a + 1;
tb = b++ + 1;
cout << "ta = " << ta << endl; // 5
cout << "tb = " << tb << endl; // 4
}