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 direita
e
d-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++) |