# 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](https://mentebinaria.gitbook.io/manual-da-linguagem-gnu-c/8.-expressoes-de-controle-de-execucao/operadores-logicos).

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](https://mentebinaria.gitbook.io/manual-da-linguagem-gnu-c/6.-aritmetica/operacoes-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.
