Пространства имён
Варианты
Действия

Приоритет операторов C

Материал из cppreference.com
< c‎ | language
 
 
Язык C
Общие темы
Препроцессор
Комментарии
Ключевые слова
Таблица ASCII
Escape-последовательности
История C
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
спецификатор inline
Типы
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор alignas (C99)
Литералы
Выражения
порядок вычисления
альтернативные операторы
операторы
приоритет операторов
Утилиты
typedef-объявление
атрибуты (C99)
приведения типов
Разное
Ассемблерные вставки
 

В следующей таблице перечислены приоритеты и ассоциативность операторов в C. Операторы перечислены сверху вниз в порядке уменьшения приоритета.

Приоритет Оператор Описание Ассоциативность
1 ++ -- Суффиксные/постфиксные инкремент и декремент Слева направо
() Вызов функции
[] Обращение к элементу массива
. Обращение к члену структуры или объединения
−> Обращение к члену структуры или объединения через указатель
(type){list} Составной литерал(C99)
2 ++ -- Префиксные инкремент и декремент Справа налево
+ Унарные плюс и минус
! ~ Логическое НЕ и побитовое НЕ
(type) Приведение типа
* Разыменование
& Взятие адреса
sizeof Размер
_Alignof Выравнивание(C11)
3 * / % Умножение, деление и остаток Слева направо
4 + Сложение и вычитание
5 << >> Побитовые левый сдвиг и правый сдвиг
6 < <= Для операторов сравнения < и ≤ соответственно
> >= Для операторов сравнения > и ≥ соответственно
7 == != Для сравнений = и ≠ соответственно
8 & Побитовое И
9 ^ Побитовое XOR (исключающее или)
10 | Побитовое ИЛИ (включающее или)
11 && Логическое И
12 || Логическое ИЛИ
13 ?: Тернарное условие Справа налево
14 = Простое присваиваиние
+= −= Присваивание через сумму и разность
*= /= %= Присваивание через произведение, частное и остаток
<<= >>= Присваивание через левый сдвиг и правый сдвиг
&= ^= |= Присваивание через побитовые И, исключающее ИЛИ и ИЛИ
15 , Запятая Слева направо

При лексическом разборе выражения любой оператор из некотрой строки будет теснее привязан (как при использовании скобок) к своим аргументам, чем любой другой, находящийся в строке ниже.

Операторы из одной ячейки (в одной ячейке могут быть перечислены несколько строк операторов) имеют одинаковый приоритет и группируются в указанном направлении. Например, выражение a=b=c разбирается как a=(b=c), а не как (a=b)=c из-за ассоциативности справа налево. Примечание: это не влияет на порядок вычисления подвыражений a, b и c.


[править] См. также

Поряд вычисления аргументов операторов во время выполнения программы.

Общие операторы
присваивания инкремент
декремент
арифметические логические сравнения доступ
к членам
другие

a = b
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(...)
a, b
(type) a
? :
sizeof