Precedência entre operadores em C

O cálculo do valor de uma expressão em notação infixa é uma processo complexo porque precisa levar em conta a relação de precedência entre of vários operadores.  Por exemplo, a expressão  x + y * z  deve ser interpretada como  x + (y * z),  ou seja, primeiro calcule o valor de  y * z  e depois some o resultado a  x.

Na tabela abaixo, os operadores da linguagem C aparecem em ordem decrescente de prioridade: ao calcular o valor de uma expressão infixa, os operadores da primeira linha são executados em primeiro lugar e os operadores da última são executados por último.

Os operadores da segunda linha da tabela são unários (um só operando) e todos os demais são binários (dois operandos).  A coluna direita indica a regra de associação para os operadores da linha:  e-d significa da esquerda para a direitad-e  significa da direita para a esquerda.  Por exemplo,  v * w / x * y % 10 * z  é interpretado como ((((v * w) / x) * y) % 10) * z.

()  []  ->  . e-d
- ++ -- ! & * ~ (type) sizeof d-e
*  /  % e-d
+  - e-d
<<  >> e-d
<  <=  >=  > e-d
==  != e-d
& e-d
^ e-d
| e-d
&& e-d
|| e-d
? : d-e
op= d-e
, e-d

A penúltima linha da tabela refere-se a expressões como x = y e x += y.  Como a associação é direita-para-esquerda, uma expressão como x = y = 100 é interpretada como x = (y = 100).

A última linha da tabela refere-se ao operador vírgula que aparece em expressões como

x = a+1, y = b+2;
e tem essencialmente o mesmo efeito que {x = a+1; y = b+2;}.

Veja mais alguns exemplos:

expressão interpretação
&x[i] &(x[i])
*p.dia *(p.dia)
a[i].b[j] ((a[i]).b)[j]
h->e->d (h->e)->d
&h->e &(h->e)
*x++ *(x++)