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