В следующей таблице операторы сгруппированы по их приоритетам.
Тип выражения | Операторы |
---|---|
первичное |
идентификатор константа стринг (выражение) |
постфиксное |
a[b] f() a.b a->b a++ a--
|
унарное |
sizeof u sizeof( a ) ++a --a &a *a +a -a ~a !a
|
приведение к типу | (тип) a |
мультипликативные |
a * b a / b a % b
|
аддитивные |
a + b a - b
|
сдвига |
a << b a >> b
|
отношения |
a < b a > b a <= b a >= b
|
равенства |
a == b a != b
|
побитовое И |
a & b
|
побитовое исключающее ИЛИ |
a ^ b
|
побитовое ИЛИ |
a | b
|
логическое И |
a && b
|
логическое ИЛИ |
a || b
|
условное *) |
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, b
|
*) выражения вычисляются справа налево
Операторы в таблице располагаются в порядке убывания приоритета. Все операторы включающие более одного операнда выполняются слева направо, за исключением условного оператора и оператора присваивания, которые выполняются справа налево. Операторы одного приоритета, за исключением оговорённых в соответствующих разделах, могут выполняться в любом порядке по выбору компилятора (при условии соблюдения алгебраических правил). В частности, компилятор для увеличения эффективности кода может перегруппировать подвыражения, которые оба и ассоциативны, и коммутативны, так, что смысл операндов (т.е. их типы и результаты) после перегруппировки не изменится.
Порядок любых побочных эффектов (например, присвоение или действия при вызове функции) также остаётся на усмотрение компилятора.