x=5+3*6;
X recebe o valor 23, não 48, pois em C a multiplicação e divisão têm maior precedência do que a adição e subtração.
char *a[10];
a é um ponteiro simples para uma matriz de 10 caracteres, ou uma matriz de 10 para caractere? A menos que você saiba as convenções de precedência em C, não há como descobrir. Semelhantemente, em E.11, vimos que por conta das instruções de precedência como *p.i = 10; não funciona. Em vez disso, a forma (*p).i = 10; deve ser usada para forçar a precedência correta.
A tabela a seguir de Linguagem de programação em C, de Kernighan e Ritchie, mostra a hierarquia de precedência em C. A linha de cima tem a maior precedência.
Operadores Associação
( [ - . Esquerda para direita
! - ++ -{- + * & (type-cast) sizeof Direita para esquerda
(na linha acima , +, - e * estão em formas unárias)
* / % Esquerda para direita
+ - Esquerda para direita
<< >> Esquerda para direita
< <= > >= Esquerda para direita
== != Esquerda para direita
& Esquerda para direita
^ Esquerda para direita
| Esquerda para direita
&& Esquerda para direita
|| Esquerda para direita
?: Esquerda para direita
= += -= *= /= %= &= ^= |= <<= >>= Direita para esquerda
, Esquerda para direita
Usando esta tabela, você pode ver que char *a[10]; é uma matriz de 10 ponteiros para caractere. Você também pode ver por que os parênteses são necessários se (*p).i for manipulado corretamente. Após adquirir prática, você memorizará a maior parte desta tabela, mas, às vezes, alguma coisa poderá não funcionar devido a algum problema de precedência.