Приоритет | Ассоциативность | Оператор | Описание | Пример |
---|---|---|---|---|
1 | Нет | :: | Область видимости | a::b |
2 | Левая | . | Доступ к члену | a.b |
2 | Левая | [] | Доступ к индексу | a[b] |
2 | Левая | () | Вызов функции | a(b) |
2 | Левая | ++ | Постинкримент | a++ |
2 | Левая | -- | Постдекримент | a-- |
3 | Правая | ++ | Преинкримент | ++a |
3 | Правая | -- | Предекримент | --a |
3 | Правая | ~ | Побитовое отрицание | ~a |
3 | Правая | ! | Логическое НЕ | !a |
3 | Правая | not | Логическое НЕ | not a |
3 | Правая | - | Математическая смена знака | -a |
3 | Правая | + | Математическое взятие модуля | +a |
3 | Правая | @ | Ссылка | @a |
3 | Правая | () | Приведение типа | a(b) |
3 | Правая | cast | Приведение типа | cast<a>(b) |
4 | Левая | ** | Возведение в степень | a**b |
5 | Левая | * | Умножение | a*b |
5 | Левая | / | Деление | a/b |
5 | Левая | % | Модуль (оставшаяся часть от деления) | a%b |
6 | Левая | + | Сложение | a+b |
6 | Левая | - | Вычитание | a-b |
7 | Левая | << | Битовый сдвиг влево | a<<b |
7 | Левая | >> | Битовый сдвиг вправо | a>>b |
7 | Левая | Битовый сдвиг вправо c сохранением знакового бита | a>>>b | |
8 | Левая | Меньше | a<b | |
8 | Левая | > | Больше | a>b |
8 | Левая | <= | Меньше или равно | a<=b |
8 | Левая | >= | Больше или равно | a>=b |
9 | Левая | == | Равно | a==b |
9 | Левая | != | Не равно | a!=b |
9 | Левая | ^^ | Логическое исключающее ИЛИ | a^^b |
9 | Левая | xor | Логическое исключающее ИЛИ | a xor b |
9 | Левая | is | Принадлежит | a is b |
9 | Левая | !is | Не принадлежит | a !is b |
10 | Левая | & | Битовое И | a&b |
11 | Левая | Битовое исключающее ИЛИ | a^b | |
12 | Левая | | | Битовое ИЛИ | a|b |
13 | Левая | && | Логическое И | a&&b |
13 | Левая | and | Логическое И | a and b |
14 | Левая | || | Логическое ИЛИ | a||b |
14 | Левая | or | Логическое ИЛИ | a or b |
15 | Правая | ? : | Тернарный оператор | a?b:c |
15 | Правая | = | Присваивание | a=b |
15 | Правая | **= | Присваивающее возведение в степень | a**=b |
15 | Правая | *= | Присваивающее умножение | a*=b |
15 | Правая | /= | Присваивающее деление | a/=b |
15 | Правая | %= | Присваивающее деление с остатком | a%=b |
15 | Правая | += | Присваивающее сложение | a+=b |
15 | Правая | -= | Присваивающее вычитание | a-=b |
15 | Правая | <<= | Присваивающий битовый сдвиг влево | a<<=b |
15 | Правая | >>= | Присваивающий битовый сдвиг вправо | a>>=b |
15 | Правая | >>>= | Присваивающий битовый сдвиг вправо c сохранением знакового бита | a>>>=b |
15 | Правая | &= | Присваивающее битовое И | a&=b |
15 | Правая | ^= | Присваивающее битовое исключающее ИЛИ | a^=b |
15 | Правая | |= | Присваивающее битовое ИЛИ | a|=b |
15 | Правая | ?: | Теранрный оператор | a ? b : c |
16 | Левая | , | Перечисление | a,b |
Ассоциативность
Определяет направление разбора выражения.
- Левая: слева направо
- Правая: справа налево
Для примера возьмём правостороннее присваивание с левосторонним сложением:
a = b = c + d + e
Чтоб не вдаваться в подробности, представим что компилятор под капотом заведёт переменную x для промежуточных вычислений и тогда порядок будет таким:
x = c + d
x = x + e
b = x
a = b
Для любителей байткода выражение будет выглядеть так:
ASSIGN(a, ASSIGN(b, ADD(ADD(c, d), e)))
Приоритет
Операции выполняются не слева на право, а следуя приоритету. Чем меньше значение в таблице тем приоритет считается выше, тобишь операция выполнится раньше других. Для операций с одинаковым приоритетом операции будут выполняться в порядке, заданном ассоциативностью.
Возьмём операции с разным приоритетом, например присваивание, умножение и сложение:
a = b + c * d
Вспомнив про переменную x из прошлого абзаца, запишем порядок выполнения:
x = c * d
x = b + x
a = x
Так же не забудем про любителей байткода:
ASSIGN(a, ADD(b, MUL(c, d)))
Ред. Unryze