Если операции имеют одинаковый приоритет, то очерёдность выполнения таких операций определяется согласно свойству ассоциативности.
В таблице 1 показаны основные операции в С++, их приоритет выполнения и ассоциативность.
Приоритет | Операция | Ассоциативность | Описание |
---|---|---|---|
1 | :: | слева направо | унарная операция разрешения области действия |
[ ] | операция индексирования | ||
() | круглые скобки | ||
. | обращение к члену структуры или класса | ||
-> | обращение к члену структуры или класса через указатель | ||
2 | ++ | слева направо | постфиксный инкремент |
— | постфиксный декремент | ||
3 | ++ | справа налево | префиксный инкремент |
— | префиксный декремент | ||
4 | * | слева направо | умножение |
/ | деление | ||
% | остаток от деления | ||
5 | + | слева направо | сложение |
— | вычитание | ||
6 | >> | слева направо | сдвиг вправо |
<< | сдвиг влево | ||
7 | < | слева направо | меньше |
<= | меньше либо равно | ||
> | больше | ||
>= | больше либо равно | ||
8 | == | слева направо | равно |
!= | не равно | ||
9 | && | слева направо | логическое И |
10 | || | слева направо | логическое ИЛИ |
11 | ?: | справа налево | условная операция (тернарная операция) |
12 | = | справа налево | присваивание |
*= | умножение с присваиванием | ||
/= | деление с присваиванием | ||
%= | остаток от деления с присваиванием | ||
+= | сложение с присваиванием | ||
-= | вычитание с присваиванием | ||
13 | , | слева направо | запятая |
Не всегда удаётся запомнить приоритет операций, поэтому, если не уверены в очередности выполнения операций в выражении, указывайте явно очерёдность выполнения операций, то есть расставьте круглые скобочки. Рассмотрим фрагмент кода, в котором важную роль играет приоритет операций.
// не правильное выражение int value = 5; cout << value += 3; //(ОШИБКА) передаем в поток вывода значение переменной value + 3
Компилятор не поймет выражения в строке 3, так как операция сдвига влево имеет больший приоритет нежели операция суммирования с присваиванием. В итоге программу с таким выражением даже нельзя будет запустить. Суть в том, что компилятор понимает это выражение не так как мы, а совсем по-другому. Как будет рассуждать компилятор: «В выражении две операции, причём первая операция <<
имеет больший приоритет, чем вторая +=
, значит передам сначала в поток вывода значение переменной value
, а потом прибавлю 3 к ?????? А не к чему прибавить 3, так как переменная value
передаётся в поток вывода.» Вот в этом и заключается ошибка, а чтобы её не было необходимо просто поставить круглые скобки.
// правильное выражение int value = 5; cout << (value += 3); // передаем в поток вывода значение переменной value + 3
В таком случае, сначала выполнится выражение в круглых скобках, а потом значение переменной value
передастся в поток вывода.
Комментарии
Александр Безрук
А где же операция разыменования (косвенности), операция «&-адрес», операция приведения к типу?Здесь более полная таблица http://ru.cppreference.com/w/cpp/language/operator_precedence
Артур Леонов
не могу понять, как использовать » :: » и в чём.
NaikoN
Согласно рис.1 операция с меньшим приоритетам имеют более высокий приоритет при выполнении программы???
admin
Именно, чем выше в таблице операция, тем больший приоритет.