Приоритет операторов 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; )

Вывод

 число1 = -97 число2 = -97 число3 = -72

Примечание. Поскольку в C ++ существует множество операторов с несколькими уровнями приоритета, настоятельно рекомендуется использовать круглые скобки, чтобы сделать наш код более читабельным.

Таблица приоритета операторов C ++

В следующей таблице (взятой с сайта cppreference.com) показан приоритет операторов C ++. Уровень приоритета 1 означает операторы с наивысшим приоритетом, а уровень приоритета 17 означает операторы с самым низким приоритетом.

О свойстве ассоциативности мы поговорим чуть позже.

Приоритет Оператор Описание Ассоциативность
1 :: Разрешение области Слева направо
2 a ++
a--
type ()
type ()
a ()
a ()
.
->
Приращение
суффикса / постфикса
Приведение суффикса / постфикса Приведение
функции Приведение
функции Вызов функции
Подстрочный
индекс Доступ к
члену из объекта Доступ к члену из объекта ptr
Слева направо
3 ++ a
--a
+ a
-a
!
~
(type)
* a
& a
sizeof
co_await
new new ()
delete delete ()
Приращение
префикса Декремент префикса
Унарный плюс
Унарный минус
Логическое НЕ
Побитовое НЕ
Приведение в стиле C
Косвенное
обращение (разыменование) Адрес-
размера
-выражения - ожидания
Динамическое выделение
памяти Динамическое освобождение памяти
Справа налево
4 . *
-> *
Селектор объекта-
члена Селектор указателя элемента
Слева направо
5 а * б
а / б
а% б
Модуль
деления умножения
Слева направо
6 а + б
а - б
Сложение
вычитание
Слева направо
7 <<
>>
Побитовый сдвиг влево
Побитовый сдвиг вправо
Слева направо
8 <= < Оператор трехстороннего сравнения Слева направо
9 <
<=
>
> =
Меньше
Меньше или равно
Больше
Больше или равно
Слева направо
10 ==
! =
Равно
Не равно
Слева направо
11 & Побитовое И Слева направо
12 ^ Побитовое исключающее ИЛИ Слева направо
13 | Побитовое ИЛИ Слева направо
14 && Логическое И Слева направо
15 || Логическое ИЛИ Слева направо
16 а? b: c
throw
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Тернарный Условный
оператор throw
yield expression (C ++ 20)
Присваивание
Добавление Присваивание
Вычитание Присваивание Присваивание
Умножение Присваивание
Деление Присваивание
модуля Назначение
Побитовый сдвиг Левое присвоение
Побитовый сдвиг вправо Назначение
Побитовое И Присваивание
Поразрядное ИЛИ Назначение
Побитовое ИЛИ Присваивание
Справа налево
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; )

Вывод

 а = -5 б = -1

Интересные статьи...