Приоритет выполнения операций C и C++ Печать
Добавил(а) microsin   

Для того, чтобы повысить качество кода и уменьшить количество дополнительных скобок в выражениях, полезно знать и использовать приоритет выполнения различных арифметических и логических операций.

Операции в C (Си) и C++ выполняются в соответствии со следующей таблицей приоритетов операций. Приоритет означает, в каком порядке будут вычисляться операторы в выражении - если выше приоритет, то оператор будет вычисляться раньше. Таблица организована таким образом, что чем выше строка в таблице, тем выше приоритет. Операторы, которые присутствуют в одной ячейке, имеют одинаковый приоритет, и они будут вычисляться в том порядке, как они появляются в выражении, в указанном направлении. Для того, чтобы изменить приоритет вычисления операторов, могут быть применены круглые скобки.

ПриоритетОператорОписаниеАссоциативность
1

самый высокий

:: Оператор определения контекста переменных (scope resolution, только для C++). Отсутствует
2 ++ Постинкремент (Suffix increment). Слева - направо
-- Постдекремент (Suffix decrement).
() Вызов функции.
[] Индексация в массиве.
. Выбор элемента структуры по ссылке.
-> Выбор элемента структуры по указателю.
typeid() Информация о типе по время выполнения (Run-time type information, только для C++, см. typeid).
const_cast Приведение типа (Type cast, только для C++ only, см. const_cast).
dynamic_cast Приведение типа (только для C++, см. dynamic_cast).
reinterpret_cast Приведение типа (Type cast, только для C++, см. reinterpret_cast).
static_cast Приведение типа (Type cast, только для C++, см. static_cast).
3 ++ Прединкремент (Prefix increment). Справа - налево
-- Преддекремент (Prefix decrement).
+ Унарный плюс.
- Унарный минус.
! Логическое отрицание (NOT).
~ Побитное отрицание (Bitwise NOT, дополнение до единицы, One's Complement).
(type) Преобразование типа (Type cast).
* Выборка значения по ссылке (Indirection, dereference).
& Операция взятия адреса (получение указателя).
sizeof Получение размера объекта указанного типа (структуры, переменной и т. п.).
newnew[] Динамическое выделение памяти под объект из кучи, создание объекта (только для C++).
deletedelete[] Динамическое освобождение памяти, ранее выделенной под объект, удаления объекта (только для C++).
4 .* Указатель на член (только для C++). Слева - направо
->* Указатель на член (только для C++).
5 * Умножение. Слева - направо
/ Деление.
% Взятие по модулю числа (Modulo, получение остатка от деления).
6 + Сложение. Слева - направо
- Вычитание.
7 << Побитный сдвиг влево (Bitwise left shift). Слева - направо
>> Побитный сдвиг вправо (Bitwise right shift).
8 < Меньше чем... Слева - направо
<= Меньше или равно...
> Больше чем...
>= Больше или равно...
9 == Оператор определения равенства (Equal to). Слева - направо
!= Оператор определения неравенства (Not equal to)
10 & Побитная операция И (Bitwise AND) Слева - направо
11 ^ Побитная операция Исключающее ИЛИ (Bitwise XOR, exclusive or). Слева - направо
12 | Побитная операция ИЛИ (Bitwise OR, inclusive or). Слева - направо
13 && Логическая операция И (AND). Слева - направо
14 || Логическая операция ИЛИ (OR). Слева - направо
15 ?: Тернарный оператор (Ternary conditional, см. ?:). Справа - налево
16 = Прямое присваивание. Справа - налево
+= Присваивание со сложением.
-= Присваивание с вычитанием.
*= Присваивание с умножением.
/= Присваивание с делением.
%= Присваиванием с взятием остатка от деления.
<<= Присваивание со побитным сдвигом влево.
>>= Присваивание с побитным сдвигом вправо.
&= Присваивание с побитным AND.
^= Присваивание с побитным XOR.
|= Присваивание с побитным OR.
17 throw Оператор генерации исключения (Throw operator, exceptions throwing, только для C++). Справа - налево
18

самый низкий

, Запятая (Comma) Слева - направо

Несмотря на то, что приведенная таблица является вполне адекватной, в ней не учтены все тонкости языка. В частности имейте в виду, что тернарный оператор (15 строка в таблице) позволяет применять в среднем операнде любые произвольные выражения несмотря на то, что он перечислен с более высоким приоритетом, чем операции запятая и присваивание.

[Ссылки]

1. Operators in C and C++ site:wikipedia.org.