Преференція та асоціативність оператора C ++

У цьому підручнику ми дізнаємося про перевагу та асоціативність операторів у 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

Цікаві статті...