Precedência de operador

A linguagem C contém muitos operadores, e por causa do modo como funciona a precedência, as interações entre múltiplos operadores podem se tornar confusas.

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.