Для того, чтобы повысить качество кода и уменьшить количество дополнительных скобок в выражениях, полезно знать и использовать приоритет выполнения различных арифметических и логических операций.
Операции в 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 |
Получение размера объекта указанного типа (структуры, переменной и т. п.). |
new , new[] |
Динамическое выделение памяти под объект из кучи, создание объекта (только для C++). |
delete , delete[] |
Динамическое освобождение памяти, ранее выделенной под объект, удаления объекта (только для 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. |