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
  • Regras para o Operador Condicional
  • Ramos do Operador Condicional

Isto foi útil?

Editar no GitHub
Exportar como PDF
  1. 8. Expressões de Controle de Execução

Expressão Condicional

AnteriorOperadores Lógicos e AtribuiçõesPróximoOperador Vírgula

Atualizado há 7 meses

Isto foi útil?

C possui uma expressão condicional que seleciona uma de duas expressões para calcular e obter o valor. Ela se parece com isto:

condição ? se_verdadeiro : se_falso

Regras para o Operador Condicional

O primeiro operando, condição, deve ser um valor que possa ser comparado com zero — um número ou um ponteiro. Se for verdadeiro (diferente de zero), a expressão condicional calcula se_verdadeiro e seu valor se torna o valor da expressão condicional. Caso contrário, a expressão condicional calcula se_falso e seu valor se torna o valor da expressão condicional. A expressão condicional sempre calcula apenas uma das duas, se_verdadeiro ou se_falso, nunca ambas.

Aqui está um exemplo: o valor absoluto de um número x pode ser escrito como:

(x >= 0 ? x : -x)

Aviso: Os operadores de expressão condicional têm uma precedência sintática relativamente baixa. Exceto quando a expressão condicional é usada como argumento em uma chamada de função, escreva parênteses ao redor dela. Para maior clareza, sempre escreva parênteses ao redor se ela se estender por mais de uma linha.

Os operadores de atribuição e o operador vírgula (veja ) têm precedência mais baixa do que os operadores de expressão condicional, então coloque parênteses ao redor deles quando aparecerem dentro de uma expressão condicional. Veja .

Ramos do Operador Condicional

Chamamos os ramos (branches) da expressão condicional de se_verdadeiro e se_falso.

Os dois ramos normalmente devem ter o mesmo tipo, mas algumas exceções são permitidas. Se ambos forem tipos numéricos, a expressão condicional converte ambos para o tipo comum (veja ).

Com ponteiros (veja ), os dois valores podem ser ponteiros para tipos minimamente compatíveis (veja ). Nesse caso, o tipo de resultado é um ponteiro semelhante, cujo tipo de destino combina todos os qualificadores de tipo (veja ) de ambos os ramos.

Se um dos ramos tiver o tipo void * e o outro for um ponteiro para um objeto (não para uma função), a expressão condicional converte o ramo void * para o tipo do outro.

Se um dos ramos for uma constante inteira com valor zero e o outro for um ponteiro, a expressão condicional converte zero para o tipo do ponteiro.

No GNU C, você pode omitir se_verdadeiro em uma expressão condicional. Nesse caso, se a condição for diferente de zero, seu valor se torna o valor da expressão condicional, após a conversão para o tipo comum. Assim,

x ? : y

tem o valor de x se for diferente de zero; caso contrário, o valor de y.

Omitir se_verdadeiro é útil quando a condição tem efeitos colaterais. Nesse caso, escrever a expressão duas vezes executaria os efeitos colaterais duas vezes, mas escrevê-la uma vez os executa apenas uma vez. Por exemplo, supondo que a função next_element avance uma variável ponteiro para apontar para o próximo elemento em uma lista e retorne o novo ponteiro,

next_element () ? : default_pointer

é uma maneira de avançar o ponteiro e usar seu novo valor, se ele não for nulo, mas usar default_pointer se for nulo. Não podemos fazer da seguinte forma:

next_element () ? next_element () : default_pointer

porque isso avançaria o ponteiro uma segunda vez.

🕹️
Operador Vírgula