Manual da Linguagem GNU C
Doar para o tradutorDoar para os autores
  • Linguagem GNU C
  • Prefácio
  • 1️1. O Primeiro Exemplo
    • Fibonacci Recursiva
      • Cabeçalho da Função
      • Corpo da Função
    • Pilha e Estouro de Pilha
    • Fibonacci Iterativa
  • 📦2. Um Programa Completo
    • Exemplo de um Programa Completo
    • Explicação do Programa Completo
    • Programa Completo Linha por Linha
    • Compilando o Programa de Exemplo
  • 👜3. Armazenamento e Dados
  • 🥑4. Além dos Inteiros
    • Um Exemplo com Números Não Inteiros
    • Um Exemplo com Arrays
    • Variações para o Exemplo com Array
  • ✍️5. Sintaxe Lexical
    • Escreva Programas em Inglês!
    • Caracteres
    • Espaços em Branco
    • Comentários
    • Identificadores
    • Operadores e Pontuação
    • Continuação de Linha
  • ➕6. Aritmética
    • Aritmética Básica
    • Aritmética de Inteiros
    • Estouro de Inteiros
      • Estouro de Inteiros sem Sinal
      • Estouro de Inteiros com Sinal
    • Aritmética em Modo Misto
    • Divisão e Resto
    • Comparações Numéricas
    • Operações de Deslocamento
      • Deslocar Gera Novos Bits
      • Advertências em Operações de Deslocamento
      • Hacks com Deslocamento
    • Operações Bit-a-bit
  • 🟰7. Expressões de Atribuição
    • Atribuição Simples
    • Lvalues
    • Atribuição Modificadora
    • Operadores de Incremento e Decremento
    • Pós-incremento e Pós-decremento
    • Armadilha: Atribuição em Subexpressões
    • Escreva Atribuições em Instruções Separadas
  • 🕹️8. Expressões de Controle de Execução
    • Operadores Lógicos
    • Operadores Lógicos e Comparações
    • Operadores Lógicos e Atribuições
    • Expressão Condicional
    • Operador Vírgula
  • 🐫9. Gramática dos Operadores Binários
  • 🏁10. Ordem de Execução
    • Reordenação de Operandos
    • Associatividade e Ordenação
    • Pontos de Sequência
    • Pós-incremento e Ordenação
    • Ordenação de Operandos
    • Otimização e Ordenação
  • 🎲11. Tipos Primitivos
    • Tipos de Dados Inteiros
      • Inteiros Básicos
      • Tipos Com ou Sem Sinal
      • Inteiros Estreitos
      • Conversão entre Tipos Inteiros
      • Tipo Booleano
      • Variações de Inteiros
    • Tipos de Dados de Ponto Flutuante
    • Tipos de Dados Complexos
    • O Tipo Void
    • Outros Tipos de Dados
    • Designadores de Tipos
  • 🪨12. Constantes
    • Constantes do Tipo Inteiro
    • Tipos de Dados de Constantes do Tipo Inteiro
    • Constantes de Ponto Flutuante
    • Constantes de Números Imaginários
    • Constantes de Caracteres
    • Constantes do Tipo String
    • Constantes do Tipo String UTF-8
    • Códigos de Caracteres Unicode
    • Constantes do Tipo Caractere Largo
    • Constantes do Tipo String Larga
  • 📐13. Tamanho de Tipo
  • Apêndices
    • F - GNU Free Documentation License
    • G - GNU General Public License
Fornecido por GitBook
Nesta página

Isto foi útil?

Editar no GitHub
Exportar como PDF

9. Gramática dos Operadores Binários

AnteriorOperador VírgulaPróximo10. Ordem de Execução

Atualizado há 6 meses

Isto foi útil?

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 .

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.

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.

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 .

🐫
Operadores Lógicos
Operações Bit-a-bit