🐫9. Gramática dos Operadores Binários

Operadores binários são aqueles que recebem dois operandos, um à esquerda e outro à direita.

Todos os operadores binários em C são sintaticamente associativos à esquerda. Isso significa que a op b op c significa (a op b) op c. No entanto, os únicos operadores que você deve repetir dessa forma sem parênteses são +, -, * e /, pois esses casos são claros na álgebra. Então, é aceitável escrever a + b + c ou a - b - c, mas nunca a == b == c ou a % b % c. Para esses operadores, use parênteses explícitos para mostrar como as operações se aninham.

Cada operador em C possui uma precedência, que é sua posição na ordem gramatical entre os vários operadores. Os operadores com a maior precedência capturam operandos adjacentes primeiro; essas expressões, então, se tornam operandos para operadores de menor precedência.

A ordem de precedência dos operadores em C é totalmente especificada, portanto, qualquer combinação de operações leva a um aninhamento bem definido. Declaramos apenas uma parte da ordem completa de precedência aqui, pois é uma má prática para o código C depender dos outros casos. Para casos não especificados neste capítulo, sempre use parênteses para tornar o aninhamento explícito.

Você pode depender desta subsequência da ordem de precedência (de maior para menor):

  • Operações pós-fixadas: acesso a um campo ou alternativa (‘.’ e ‘->’), indexação de array, chamadas de função e operadores unários pós-fixados.

  • Operadores unários prefixados.

  • Multiplicação, divisão e resto (eles têm a mesma precedência).

  • Adição e subtração (eles têm a mesma precedência).

  • Comparações — mas atenção!

  • Operadores lógicos && e || — mas atenção!

  • Expressão condicional com ? e :.

  • Atribuições.

  • Execução sequencial (o operador vírgula, ,).

Duas das linhas na lista acima dizem "mas atenção!" Isso significa que a linha cobre operadores com precedência sutilmente diferente. Nunca dependa da gramática de C para decidir como duas comparações se aninham; em vez disso, sempre use parênteses para especificar o aninhamento.

Você pode deixar vários operadores && ou || se associarem, mas sempre use parênteses para mostrar como && e || se aninham entre si. Veja Operadores Lógicos.

Há uma outra ordem de precedência da qual o código pode depender:

  • Operadores unários pós-fixados.

  • Operadores bit-a-bit e de deslocamento — mas atenção!

  • Expressão condicional com ? e :.

A advertência para operadores bit-a-bit e de deslocamento é similar à dos operadores lógicos: você pode deixar múltiplos usos de um operador bit-a-bit se associarem, mas sempre use parênteses para controlar o aninhamento de operadores diferentes.

Essas listas não especificam qualquer ordem de precedência entre os operadores bit-a-bit e de deslocamento da segunda lista e os operadores binários acima das expressões condicionais na primeira lista. Quando eles aparecem juntos, coloque parênteses. Veja Operações Bit-a-bit.

Nota pessoal de Richard Stallman: Eu escrevi o GCC sem lembrar nada sobre a ordem de precedência em C além do que está declarado aqui. Estudei a tabela completa de precedência para escrever o parser do GCC e prontamente a esqueci novamente. Se você precisar consultar a ordem completa de precedência para entender algum código em C, adicione parênteses suficientes para que ninguém mais precise fazer isso.

Atualizado