Мануалы > Приоритет операторов

Мы не продаём знания — мы ими делимся!

Сделать вклад

собираем 100к на поощрение команды курса

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

Операторы — это символы, которые указывают компилятору на необходимость выполнения какой-нибудь операции с одним или несколькими операндами.

Операнд — это то, на что воздействует оператор.

Примеры:

3 + 7   // 3 и 7 — это операнды, а + — оператор. 
i++     // i — операнд, ++ — оператор
*p      // p — операнд, * — оператор

Один и тот же символ в разных контекстах может указывать на разные операции, например, *, &, -, +.

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

Таблица приоритетов операторов языка Си

1 приоритет

  • ( ) группирующие скобки и вызовы функции
  • [] индексация массива
  • ., -> прямой и косвенный доступ к элементу структуры или объединения
  • ++, -- постфиксные инкремент и декремент

2 приоритет (обратная ассоциативность, справа налево)

  • +, - унарные плюс и минус -
  • ! логическое отрицание
  • ~ побитовое отрицание
  • ++, -- префиксные инкремент и декремент
  • & взятие адреса
  • * косвенная адресация
  • (type) приведение к типу
  • sizeof получение размера операнда

3 приоритет

  • *, / и %

4 приоритет

  • +, - бинарные сложение и вычитание

5 приоритет

  • <<, >> побитовые сдвиги влево и вправо

6 приоритет

  • <, <=, >, >= сравнения

7 приоритет

  • ==, != проверка равенства и неравенства

8 приоритет

  • & побитовое И

9 приоритет

  • ^ побитовое Исключающее ИЛИ

10 приоритет

  • | побитовое ИЛИ

11 приоритет

  • && логическое И

12 приоритет

  • || логическое ИЛИ

13 приоритет (обратная ассоциативность, справа налево)

  • ? : условный оператор

14 приоритет (обратная ассоциативность, справа налево)

  • =, +=, -=, *=, \=, %=, >>=, <<=, &=, ^=, |= присваивания

15 приоритет

  • ,

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

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

Примеры:

int x = 10 / 2 * 5; // = 25, т.к. для операторов / и * ассоциативность прямая, 
                    // вычисляются слева направо. Эквивалентно выражению (10 / 2) * 5 

Группы операторов, имеющие обратную ассоциативность (вычисляются справа налево), обозначены в таблице выше.