В этом руководстве мы узнаем о приоритете и ассоциативности операторов в 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








