В следующей таблице перечислены приоритет и ассоциативность операций C++. Операции перечислены сверху вниз в порядке убывания приоритета (т.е. вверху находятся операторы, которые выполняются в первую очередь).
Приоритет |
Операция |
Описание |
Ассоциативность |
1 |
:: |
Область видимости |
Слева направо |
2 |
a++ a-- |
Постинкремент и постдекремент |
() |
Вызов функции |
[] |
Обращение к массиву по индексу |
. |
Выбор элемента по ссылке |
−> |
Выбор элемента по указателю |
3 |
++a --a |
Прединкремент и преддекремент |
Справа налево |
+ − |
Унарный плюс и минус |
! ~ |
Логическое НЕ и побитовое НЕ |
(type) |
Приведение к типу type |
* |
Indirection (разыменование) |
& |
Адрес |
sizeof |
Размер |
new, new[] |
Динамическое выделение памяти |
delete, delete[] |
Динамическое освобождение памяти |
4 |
.* ->* |
Указатель на член |
Слева направо |
5 |
* / % |
Умножение, деление и остаток |
6 |
+ − |
Сложение и вычитание |
7 |
<< >> |
Побитовый сдвиг влево и вправо |
8 |
< <= |
Операции сравнения < и ≤ |
> >= |
Операции сравнения > и ≥ |
9 |
== != |
Операции сравнения = и ≠ |
10 |
& |
Побитовое И |
11 |
^ |
Побитовый XOR (исключающее ИЛИ) |
12 |
| |
Побитовое ИЛИ (inclusive or) |
13 |
&& |
Логическое И |
14 |
|| |
Логическое ИЛИ |
15 |
?: |
Тернарное условие |
Справа налево |
= |
Прямое присваивание (предоставляемое по умолчанию для C++ классов) |
+= −= |
Присвоение с суммированием и разностью |
*= /= %= |
Присвоение с умножением, делением и остатком от деления |
<<= >>= |
Присвоение с побитовым сдвигом слево и вправо |
&= ^= |= |
Присвоение с побитовыми логическими операциями (И, XOR, ИЛИ) |
16 |
throw |
Операция выброса исключения |
17 |
, |
Запятая |
Слева направо |
При разборе выражения операция, указанная в некоторой строке таблицы, более тесно связана с аргументами (как в случае применения скобок), чем любая операция из строк, расположенных ниже. Например, выражения std::cout <<a&b и *p++ будут разобраны как (std::cout <<a)&b и *(p++), а не как std::cout <<(a&b) и (*p)++.
Операции, расположенные в одной ячейке (в одной ячейке может быть несколько строк) имеют одинаковый приоритет и разбираются с учетом ассоциативности. Например, выражение a=b=c будет разобрано как a=(b=c), а не (a=b)=c, так как операция присваивания правоассоциативна.
Перегрузка операций не влияет на приоритеты.
Примечание
Стандарт не определяет порядок приоритетов. Они выводятся из грамматики языка.
const_cast , static_cast , dynamic_cast , reinterpret_cast и typeid не включены в таблицу, так как они никогда не двусмысленны.
Смотрите также
Order of evaluation of operator arguments at run time.
Common operators |
назначение |
incrementNJdecrement |
арифметики |
логичной |
сравнение |
memberNJaccess |
другие |
a = b a = rvalue a += b a -= b a *= b a /= b a %= b a &= b a |= b a ^= b a <<= b a >>= b |
++a --a a++ a-- |
+a -a a + b a - b a * b a / b a % b ~a a & b a | b a ^ b a << b a >> b |
!a a && b a || b |
a == b a != b a < b a > b a <= b a >= b |
a[b] *a &a a->b a.b a->*b a.*b |
a(...) a, b (type) a ? : |
Special operators |
static_cast преобразует один тип на другой совместимый типа
dynamic_cast преобразует виртуальный базовый класс для производных class
const_cast преобразует тип совместимого типа с различными cv qualifiers
reinterpret_cast преобразует тип несовместимы type
new выделяет memory
delete освобождает memory
sizeof запрашивает размер type
sizeof... запрашивает размер Параметр пакета (начиная с C++11)
typeid запрашивает сведения о типе type
noexcept проверяет выражение может вызвать исключение (начиная с C++11)
alignof запросов выравнивание требований типа (начиная с C++11) |