Qual a saída da seguinte expressão lógica em C? Justifique sua resposta.
int \mathrm{a}=5, \mathrm{~b}=10, \mathrm{c}=0;
printf("%d", (a < b) && (b > c));

Passo 1

O enunciado dá o seguinte código (peguei os valores das variáveis do enunciado):
  • As variáveis: a=5, b=10, c=0.
  • A expressão impressa é \text{printf}("\%d",\; (a < b)\\ \text{&&}\\ (b > c));.
O que o exercício pede:
  • Determinar qual será a saída exibida na tela quando esse printf for executado, e justificar por que esse valor é impresso.

Passo 2

Entendendo os comparadores < e > em C:
  • Em C, expressões como a < b e b > c comparam números e produzem um valor inteiro: 1 se a comparação for verdadeira, 0 se for falsa.
  • Em outras palavras, uma comparação resulta em um inteiro cujo significado é “verdadeiro” = 1 ou “falso” = 0.
  • Exemplo simples: se x=2 e y=3 então x<y produz 1; se x=5 e y=1 então x<y produz 0.

Passo 3

Avaliar o primeiro comparador (a < b) com os valores dados:
  • Substituindo: a=5 e b=10.
  • A comparação 5 < 10 é verdadeira.
  • Logo, (a < b) produz o inteiro 1.

Passo 4

Avaliar o segundo comparador (b > c) com os valores dados:
  • Substituindo: b=10 e c=0.
  • A comparação 10 > 0 é verdadeira.
  • Logo, (b > c) produz o inteiro 1.

Passo 5

Entendendo o operador lógico && em C:
  • O operador && é o “AND lógico”. Ele avalia se ambos os operandos são verdadeiros.
  • Antes disso, regras importantes:
    • Em C, qualquer valor diferente de zero é considerado lógico “verdadeiro” quando usado em contexto lógico; 0 é “falso”.
    • O operador && faz avaliação sequencial da esquerda para a direita e aplica short-circuit: se o operando esquerdo for falso ( 0), o operando direito não é avaliado, porque o resultado já será falso.
    • O resultado de E_1 \\ \text{&&}\\ E_2 em C é um inteiro: 1 se ambos E_1 e E_2 forem logicamente verdadeiros (não zero), caso contrário 0.

Passo 6

Aplicar && aos resultados obtidos:
  • Temos (a < b) = 1 e (b > c) = 1.
  • Então a expressão inteira (a < b)\\ \text{&&}\\ (b > c) é equivalente a 1\\ \text{&&}\\\ 1.
  • Como ambos são verdadeiros (não zero), 1\\ \text{&&}\\\ 1 produz 1 (inteiro).

Passo 7

O que printf imprime:
  • A chamada é \text{printf}("\%d",\; \text{expressão});ã com especificador \%d, que imprime o valor inteiro passado em formato decimal.
  • A expressão avaliou para 1, logo o printf exibirá o caractere \,1.
  • Observação: não há \n no final do string, então o 1 será impresso sem quebra de linha.

Passo 8

Comentário adicional (útil para prova): diferença entre \& e \text{&&}
  • Se, por engano, fosse usado o operador bit a bit \& em vez de &&, então os operandos seriam avaliados como inteiros e seria feito um AND bit a bit entre eles. No caso específico em que cada comparação produz 1, tanto 1 \& 1 quanto 1 \\ \text{&&}\\\ 1 resultam em 1. Mas semanticamente:
    • \& não faz short-circuit (ambos os lados são sempre avaliados).
    • \& realiza operação bit a bit; \text{&&} é lógica e retorna exatamente 1 ou 0.

Resposta

1

Exercícios relacionados