У цьому підручнику ми дізнаємося про перевагу та асоціативність операторів у C ++ за допомогою прикладів.
Перевага операторів C ++
Якщо в одному виразі є кілька операторів, операції не оцінюються одночасно. Швидше, оператори з вищим пріоритетом оцінюють свої операції першими.
Давайте розглянемо приклад:
int x = 5 - 17 * 6;
Тут оператор множення *
має вищий рівень переваги, ніж оператор віднімання -
. Отже, 17 * 6
оцінюється спочатку.
Як результат, наведений вище вираз еквівалентний
int x = 5 - (17 * 6);
Якщо ми хочемо оцінити 5 - 17
спочатку, тоді ми повинні вкласти їх у дужки :
int x = (5 - 17) * 6;
Приклад 1: Перевага операторів
#include using namespace std; int main() ( // evaluates 17 * 6 first int num1 = 5 - 17 * 6; // equivalent expression to num1 int num2 = 5 - (17 * 6); // forcing compiler to evaluate 5 - 17 first int num3 = (5 - 17) * 6; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; cout << "num3 = " << num3 << endl; return 0; )
Вихідні дані
num1 = -97 num2 = -97 num3 = -72
Примітка: Оскільки в C ++ багато операторів з різним рівнем переваги, настійно рекомендується використовувати дужки, щоб зробити наш код більш читабельним.
Таблиця переваги операторів C ++
Наступна таблиця (взята з cppreference.com) показує перевагу операторів C ++. Рівень переваги 1 означає операторів найвищого пріоритету, тоді як рівень переваги 17 - операторів найнижчого пріоритету.
Властивість асоціативності буде обговорено найближчим часом.
Перевага | Оператор | Опис | Асоціативність |
---|---|---|---|
1 | :: | Роздільна здатність | Зліва направо |
2 | a ++ a-- type () type () a () a () . -> | Збільшення суфікса / постфікса Зменшення суфікса / постфіксу Функція приведення Функція приведення функції Виклик функції Підписник Доступ члена від об'єкта Доступ члена від об'єкта ptr | Зліва направо |
3 | ++ a --a + a -a ! ~ (type) * a & sizeof co_await new new () delete delete () | Приріст префіксу Зменшення префіксу Одинарний плюс Одинарний мінус Логічний НЕ Побітовий НЕ Примітка стилю C Непряме (відмінювання) Адреса Розмір- очікування-вираз Динамічне виділення пам'яті Динамічне звільнення пам'яті | Право наліво |
4 | . * -> * | Селектор об'єкта- члена Селектор покажчика члена | Зліва направо |
5 | a * b a / b a% b | Множення Відділ Modulus | Зліва направо |
6 | a + b a - b | Віднімання додавання | Зліва направо |
7 | << >> | Побітове зрушення вліво Побітове зрушення вправо | Зліва направо |
8 | <= < | Тристоронній оператор порівняння | Зліва направо |
9 | < <= > > = | Менше ніж менше або дорівнює більшому, ніж більше або рівному | Зліва направо |
10 | == ! = | Дорівнює Не дорівнює | Зліва направо |
11 | & | Побітове І | Зліва направо |
12 | ^ | Побітовий XOR | Зліва направо |
13 | | | Побітове АБО | Зліва направо |
14 | && | Логічне І | Зліва направо |
15 | || | Логічне АБО | Зліва направо |
16 | а? b: c киньте co_yield = + = - = * = / = % = << = >> = & = = | = | Тернарний умовний оператор кидка вираз виходу (C ++ 20) Призначення Додавання Призначення Віднімання Призначення Помноження Призначення Відділ Призначення Модуль присвоєння Побітове зсув Ліве присвоєння Побітове зсув Праве присвоєння побітове І Присвоєння побітове Присвоєння XOR Побічне АБО Призначення | Право наліво |
17 | , | Кома оператор | Зліва направо |
Асоціативність операторів C ++
Асоціативність оператора - це напрямок, з якого оцінюється вираз. Наприклад,
int a = 1; int b = 4; // a will be 4 a = b;
Погляньте на a = 4;
заяву. Асоціативність =
оператора - справа наліво. Отже, значення b присвоюється a, а не в іншому напрямку.
Крім того, кілька операторів можуть мати однаковий рівень переваги (як ми бачимо з наведеної таблиці). Коли у виразі використовуються декілька операторів одного рівня пріоритету, вони оцінюються відповідно до їх асоціативності .
int a = 1; int b = 4; b += a -= 6;
І оператори, +=
і -=
оператори мають однаковий пріоритет. Оскільки асоціативність цих операторів знаходиться справа наліво, ось як оцінюється останнє твердження.
a -= 6
оцінюється першим. Отже, a буде -5- Потім
b += -5
буде оцінено. Отже, b буде -1
Приклад 2: Асоціативність операторів
#include using namespace std; int main() ( int a = 1; int b = 4; // a -= 6 is evaluated first b += a -= 6; cout << "a = " << a << endl; ; cout << "b = " << b; )
Вихідні дані
a = -5 b = -1