Utilizando o programa Code::Blocks, escreva, compile e execute os dois programas abaixo (Programa
e Programa B. A seguir, responda qual a diferença entre eles do ponto de vista (a) do programador (ser humano que escreveu o programa); (b) do compilador; (c) do usuário (ser humano que executa o programa).
Programa A
#include <stdio.h>
int main() {
int x;
printf( "Digite um numero " );
printf( "inteiro:" );
scanf( "%d", &x );
if ( x > 10 )
printf( "O numero digitado é maior que 10!!\n" );
else if ( x < 10 )
printf( "O numero digitado é menor que 10!!\n" );
else
printf( "O numero digitado é igual a 10!!\n" );
return 0;
}
Programa B
#include <stdio.h>
int main() {
int x;
printf( "Digite um numero inteiro:" );
scanf( "%d", &x );
printf( "O numero digitado é %s 10!!\n", x > 10 ? "maior que" : x < 10 ? "menor que" : "igual a" );
return 0;
}
#include <stdio.h>
int main() {
int x;
printf( "Digite um numero " );
printf( "inteiro:" );
scanf( "%d", &x );
if ( x > 10 )
printf( "O numero digitado é maior que 10!!\n" );
else if ( x < 10 )
printf( "O numero digitado é menor que 10!!\n" );
else
printf( "O numero digitado é igual a 10!!\n" );
return 0;
}
#include <stdio.h>
int main() {
int x;
printf( "Digite um numero inteiro:" );
scanf( "%d", &x );
printf( "O numero digitado é %s 10!!\n", x > 10 ? "maior que" : x < 10 ? "menor que" : "igual a" );
return 0;
}
Passo 1
O enunciado pede que eu escreva, compile e execute dois programas em Code::Blocks e, em seguida, responda qual a diferença entre eles do ponto de vista: (a) do programador; (b) do compilador; (c) do usuário.
As informações relevantes do enunciado e dos códigos fornecidos são:
As informações relevantes do enunciado e dos códigos fornecidos são:
- Ambos os códigos recebem um número inteiro e informam se ele é maior, menor ou igual a 10.
- No código chamado Programa A (copiado do enunciado) há uma cadeia de decisões com
if,else ifeelsee três chamadas separadas aprintfpara as mensagens finais. - No código chamado Programa B (copiado do enunciado) há uma única chamada a
printfque usa uma expressão condicional (operador ternário) aninhada para escolher a parte da string que será impressa. - Ambos usam
scanf( "%d", &x );para ler o inteiro (ondeé a variável inteira lida). - A pergunta final pede comparações em três aspectos: programador (humano que escreveu), compilador (quem traduz o código em máquina) e usuário (quem executa).
Passo 2
O que cada programa faz, na prática (com exemplos concretos para clarear):
- Ambos pedem ao usuário que digite um número inteiro e, dependendo do valor de
, exibem uma mensagem igual a uma destas três: - “O numero digitado é maior que 10!!”
- “O numero digitado é menor que 10!!”
- “O numero digitado é igual a 10!!”
- Exemplos de execução:
- Entrada
→ saída “O numero digitado é maior que 10!!” - Entrada
→ saída “O numero digitado é menor que 10!!” - Entrada
→ saída “O numero digitado é igual a 10!!”
- Entrada
Isso confirma que, em termos de funcionalidade percebida, os dois programas querem produzir exatamente o mesmo resultado.
Passo 3
Explicando passo a passo o que o Programa A faz (didático — para você entender e poder reproduzir na prova):
- Declaração e leitura:
int x;cria uma variável inteira chamada. scanf( "%d", &x );lê um número inteiro do teclado e guarda em. Aqui é importante entender que scanfprecisa do endereço de memória onde guardar o valor, por isso usamos&x: isso passa aoscanfo local onde o número deve ser armazenado.
- Estrutura de decisão (
if/else if/else):if ( x > 10 )testa se o valor deé maior que 10. Se for, executa o primeiro printf.else if ( x < 10 )só é avaliado se a condição anterior foi falsa; testa seé menor que 10. Se for, executa o segundo printf.elseé o caso restante: senão é maior nem menor que 10, então obrigatoriamente é igual a 10, e executa o terceiro printf.
- Cada
printfimprime a mensagem completa correspondente e inclui\npara terminar a linha.
Resumo didático: oif-else if-elseé a forma mais direta e explícita de escrever várias alternativas mutuamente excludentes.
Passo 4
Explicando passo a passo o que o Programa B faz e o operador ternário (didático):
- Declaração e leitura: iguais ao Programa A (
int x;escanf("%d",&x);). - A diferença central é nesta linha:
printf( "O numero digitado é %s 10!!\n", x > 10 ? "maior que" : x < 10 ? "menor que" : "igual a" );
- O que está acontecendo aqui:
printftem um formato com"%s": isso indica que ele espera um argumento do tipo string (ponteiro para caractere), e esse argumento será colocado onde está"%s"na string de formato.- A expressão usada como segundo argumento é uma expressão condicional (operador ternário). A forma geral do operador ternário é:
condição ? expressão_se_verdadeiro : expressão_se_falso
- No Programa B há uma ternária aninhada. A expressão inteira é:
-
- Importante: o operador ternário em C é associativo à direita, então a expressão aninhada é equivalente a:
-
- Assim, primeiro é avaliado
x > 10. Se verdadeiro, o resultado da expressão é"maior que". Se falso, avalia-se(x < 10 ? "menor que" : "igual a"), ou seja, decide entre"menor que"e"igual a".
- O
printfrecebe, portanto, a string escolhida e imprime a mensagem completa numa única chamada. - Didaticamente: o operador ternário é uma forma concisa de escolher entre duas expressões com base numa condição; quando aninhado, permite escolher entre mais de duas opções, mas a legibilidade cai se ficar muito complexo.
Passo 5
Diferenças do ponto de vista do programador (humano que escreve o programa) — explicadas e com justificativas:
- Legibilidade e clareza:
- Programa A (if-else): é mais explícito. Cada ramo tem sua própria linha
printf. Para um leitor (ou para você na prova) fica claro o que acontece em cada caso. É mais fácil de modificar (por exemplo, alterar apenas a mensagem do caso “maior que”). - Programa B (ternário em
printf): é mais compacto — tudo em uma linha. Isso pode ser visto como elegante por quem domina a linguagem, mas para iniciantes ou em código que precisa ser mantido por muitos, pode ser menos legível.
- Programa A (if-else): é mais explícito. Cada ramo tem sua própria linha
- Facilidade de manutenção:
- Se no futuro quiser adicionar outra condição ou mais informações, o
if-else(Programa A) escala melhor em clareza. Com ternário aninhado envelhece mal: fica confuso.
- Se no futuro quiser adicionar outra condição ou mais informações, o
- Concisão:
- Programa B economiza algumas linhas e evita repetir a parte fixa da mensagem (
"O numero digitado é "e" 10!!\n"). Isso reduz repetição de código — bom para evitar inconsistências.
- Programa B economiza algumas linhas e evita repetir a parte fixa da mensagem (
- Propensão a erros:
- Com ternário aninhado é mais fácil errar parênteses ou confundir a ordem das condições. Em prova, se pedirem escrever algo rápido,
if-elseé menos sujeito a erro por engano de sintaxe.
- Com ternário aninhado é mais fácil errar parênteses ou confundir a ordem das condições. Em prova, se pedirem escrever algo rápido,
- Preferência prática:
- Para exercícios e provas é comum preferir
if-elsepor clareza; para código de produção curto e bem comentado, ternário pode ser aceitável quando é simples.
Resumo para o programador: Programa A = mais claro e seguro; Programa B = mais compacto, potencialmente menos legível.
- Para exercícios e provas é comum preferir
Passo 6
Diferenças do ponto de vista do compilador — explicadas (fases e otimizações):
- O que o compilador precisa fazer:
- Ambos os programas são válidos C e serão pré-processados, compilados para código objeto e ligados para produzir um executável. As fases (pré-processador, compilador, assembler, linker) são as mesmas para os dois.
- Geração de código:
- Conceitualmente, o compilador traduz as decisões (
if/elseou a avaliação do operador ternário) em instruções de comparação e saltos condicionais, ou em instruções que selecionam um valor com base numa condição. - Resultado prático: o código objeto resultante de A e B será muito parecido — ambos terão comparações de
com 10 e saltos/seleção para escolher qual string imprimir e, em seguida, chamarão printf.
- Conceitualmente, o compilador traduz as decisões (
- Otimizações:
- Compiladores modernos (com otimização ligada) frequentemente transformam construções diferentes em código de máquina quase idêntico se o comportamento observado for o mesmo. Ou seja, depois de otimizar, A e B podem gerar exatamente o mesmo assembly.
- Warnings e erros:
- Nenhum dos dois deve gerar warnings com compilador padrão em modo default. Ambos usam corretamente
printf/scanfe tipos compatíveis (%scom string literal,%dcomintvia&x).
- Nenhum dos dois deve gerar warnings com compilador padrão em modo default. Ambos usam corretamente
- Diferença prática para o compilador:
- Internamente, o compilador trata
if-elsee operador ternário como construções distintas na árvore sintática abstrata, mas essa diferença é de implementação interna; não muda o executável final necessariamente.
Resumo para o compilador: Do ponto de vista do código gerado, provavelmente nenhuma diferença relevante; internamente, são estruturas diferentes, mas otimizadores tendem a produzir código similar.
- Internamente, o compilador trata
Passo 7
Diferenças do ponto de vista do usuário (quem executa o programa):
- Saída e interação:
- Para o usuário final, os dois programas apresentam o mesmo comportamento: pedem um inteiro e exibem uma mensagem equivalente para >10, <10 e =10.
- O prompt em ambos é apresentado sem quebra de linha antes de digitar, e a mensagem final inclui
\n. Logo, a experiência visual é idêntica.
- Performance:
- A diferença de desempenho é insignificante aqui (um par de comparações e uma chamada a
printf), e o usuário não notará diferença no tempo de resposta.
- A diferença de desempenho é insignificante aqui (um par de comparações e uma chamada a
- Erros perceptíveis:
- Não há diferença perceptível; ambos produzem as mesmas mensagens para as mesmas entradas.
Resumo para o usuário: Nenhuma diferença prática — os dois programas são equivalentes na experiência de uso.
- Não há diferença perceptível; ambos produzem as mesmas mensagens para as mesmas entradas.
Passo 8
Dicas finais para a prova (prático e encorajador):
- Se pedirem clareza ou se for um exercício pedagógico, prefira
if-else(como no Programa A). É mais fácil de explicar passo a passo e menos arriscado. - Use operador ternário para expressões simples e quando quiser evitar repetir partes comuns da mensagem, mas evite aninhamentos complexos — isso costuma confundir avaliador e colega de equipe.
- Sempre lembre: testar com valores limites (
) para garantir que a lógica cobre todos os casos. Você tá indo bem — com calma e prática você resolve essas provas!
Resposta
(a) Do programador: Programa A é mais explícito e legível (uso de
(b) Do compilador: Ambas as versões são semanticamente equivalentes; o compilador faz as mesmas fases de tradução e, com otimizações, provavelmente gera código máquina muito parecido ou idêntico. Internamente trata
(c) Do usuário: Não há diferença prática — ambos pedem o número e exibem as mesmas mensagens para ,
e
; a experiência de uso é equivalente.
if/else if/else), mais fácil de manter; Programa B é mais conciso (usa operador ternário em uma única chamada printf) mas menos legível quando aninhado.(b) Do compilador: Ambas as versões são semanticamente equivalentes; o compilador faz as mesmas fases de tradução e, com otimizações, provavelmente gera código máquina muito parecido ou idêntico. Internamente trata
if e ternário como construtos diferentes na AST, mas isso não implica diferença funcional no executável final.(c) Do usuário: Não há diferença prática — ambos pedem o número e exibem as mesmas mensagens para