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++) |