Пример выражения:
Y=Z*A+pow(X, (double)2);
где
X, Y, Z, A, 2 – операнды;
=, +, pow, (double)<приведение типа> – операции над операндами
Каждая операция имеет вполне определенный приоритет и ассоциативность. Это
позволяет без лишних скобок однозначно понимать, к какой операции относится
операнд, стоящий между двумя соседними операциями. Например, в выражении
a + b * c
операнд b относится к операции умножения, так как у нее приоритет выше, чем у
сложения. Поэтому эквивалентное выражение со скобками будет таким:
a + (b * c)
Операции одинакового приоритета либо левоассоциативны, либо правоассоциативны.
Это значит, что операнд, находящийся между двумя такими операциями, относится
либо к левой операции, либо (в случае правой ассоциативности) к правой. В языке Си
операции сложения и вычитания имеют одинаковый приоритет и левую
ассоциативность. Поэтому в выражении
a − b + c
операнд b относится к левой операции, т.е. к «минусу», а не к «плюсу», и это
выражение эквивалентно следующему выражению со скобками:
((a − b) + c)
Таким образом, левоассоциативные операции группируются с помощью скобок слева
направо; правая ассоциативность задаёт способ группировки операций справа налево.
Примером правоассоциативной операции в языке Си является операция присваивания.
Выражение с операциями присваивания
a = b = c
эквивалентно выражению
a = ( b = c )
Приоритет и ассоциативность позволяют установить границы подвыражений,
являющихся операндами, и заключить их в скобки. Например, если в выражении
a*(b − c) + 2 + a*4*5 − d
каждый нетривиальный операнд заключить в скобки, получим:
( ( ( a * ( b − c ) ) + 2 ) + ( ( a * 4 ) * 5 ) ) − d
Каждая операция вместе со своими операндами выделена в этом примере отдельным
цветом.
Порядок выполнения операций зависит не только от расстановки скобок, но и от
порядка вычисления операндов (об этом ниже в п. 4).
В языке Си все постфиксные операции имеют одинаковый приоритет — самый
высокий по отношению к другим операциям, — и естественным образом группируются
слева направо. Приоритет префиксных операций ниже, чем у постфиксных, но выше,
чем у инфиксных. Префиксные операции естественным образом группируются справа
налево. Например, в выражении
&*p[i]++
операции & и * — префиксные, [] и ++ — постфиксные. Поэтому скобки будут
расставлены так:
&(*((p[i])++))
Инфиксные операции разбиты на несколько групп, имеющих разные приоритеты и
ассоциативность (см. таблицу в п. 6).