Если операции имеют одинаковый приоритет, то очерёдность выполнения таких операций определяется согласно свойству ассоциативности.
В таблице 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
Именно, чем выше в таблице операция, тем больший приоритет.