Qual a saída da seguinte expressão lógica em C? Justifique sua resposta.
int
;
printf("%d", (a < b) && (b > c));
int
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 expressão impressa é
.
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
e comparam números e produzem um valor inteiro: se a comparação for verdadeira, se for falsa. - Em outras palavras, uma comparação resulta em um inteiro cujo significado é “verdadeiro” =
ou “falso” = . - Exemplo simples: se
e então produz ; se e então produz .
Passo 3
Avaliar o primeiro comparador
com os valores dados:
- Substituindo:
e . - A comparação
é verdadeira. - Logo,
produz o inteiro .
Passo 4
Avaliar o segundo comparador
com os valores dados:
- Substituindo:
e . - A comparação
é verdadeira. - Logo,
produz o inteiro .
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;
é “falso”. - O operador
faz avaliação sequencial da esquerda para a direita e aplica short-circuit: se o operando esquerdo for falso (
), o operando direito não é avaliado, porque o resultado já será falso. - O resultado de
em C é um inteiro: se ambos e forem logicamente verdadeiros (não zero), caso contrário .
- Em C, qualquer valor diferente de zero é considerado lógico “verdadeiro” quando usado em contexto lógico;
Passo 6
Aplicar
aos resultados obtidos:
- Temos
= e = . - Então a expressão inteira
é equivalente a . - Como ambos são verdadeiros (não zero),
produz (inteiro).
Passo 7
O que printf imprime:
- A chamada é
com especificador , que imprime o valor inteiro passado em formato decimal. - A expressão avaliou para
, logo o printf exibirá o caractere . - Observação: não há
\nno final do string, então oserá impresso sem quebra de linha.
Passo 8
Comentário adicional (útil para prova): diferença entre
e
- 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 , tanto quanto resultam em . Mas semanticamente: -
não faz short-circuit (ambos os lados são sempre avaliados). -
realiza operação bit a bit; é lógica e retorna exatamente ou .
-