Primeiro acompanhe o programa mentalmente, depois escolha uma resposta.
#include<stdio.h>intmain(void){
int a, b;
a = 10;
b = 30;
b = a;
a = 5;
printf("a is %d, b is %d \n", a, b);
return0;
}
O que isso imprime?
a is 10, b is 30
a is 5, b is 10
a is 5, b is 30
a is 10, b is 10
Explicação: Acompanhe as atribuições uma a uma.
(1) a = 10 → a: 10
(2) b = 30 → b: 30
(3) b = a → b recebe o valor atual de a (10) → b: 10 (o 30 é sobrescrito)
(4) a = 5 → a é sobrescrito com 5 → a: 5
∴ a is 5, b is 10
Questão 2 — E se você usar %f para um int?
Mesmo programa da Questão 1, mas o %d do printf foi trocado por %f.
int a, b;
a = 10; b = 30; b = a; a = 5;
printf("a is %f, b is %f \n", a, b); // mudou para %f!
O que isso imprime?
a is 5.000000, b is 10.000000
a is 0.000000, b is 0.000000 (ou valor lixo semelhante)
Erro de compilação
Explicação: Usar %f (para ponto flutuante) em um intproduz o valor errado.
A saída exata depende da plataforma, mas normalmente você vê 0.000000 ou algum número sem sentido. Use %d para int e %f para double.
Questão 3 — E se você usar %d para um double?
double a, b;
a = 3.1; b = 2.6; b = 2.12; a = 4.52;
printf("a is %f, b is %d \n", a, b); // só b usa %d!
O que isso imprime?
a is 4.520000, b is 2.120000
a is 4.520000, b is 2
a is 4.520000, b is (valor lixo)
Explicação:a é impresso corretamente como 4.520000 com %f, mas b é um double sendo impresso com %d (para int), então não será exibido corretamente.
Em algumas plataformas você verá algo como -488420520. Sempre use %f para valores double.
Questão 4 — %.2f e arredondamento
Como %.2f lida com os dígitos finais?
#include<stdio.h>intmain(void){
double a = 3.145;
double b = 3.144;
printf("a=%.2f, b=%.2f\n", a, b);
return0;
}
O que isso imprime?
a=3.14, b=3.14 (truncado)
a=3.14, b=3.15
a=3.15, b=3.14 (arredondado)
a=3.145, b=3.144 (como está)
Explicação:%.2farredonda o valor (não trunca).
• 3.145 → terceira casa decimal é 5 → arredonda para cima → 3.15
• 3.144 → terceira casa decimal é 4 → arredonda para baixo → 3.14
Isso muda apenas como o valor é exibido; as variáveis a e b não são alteradas.
Questão 5 — Múltiplos valores em um printf
Um único printf pode exibir várias variáveis de uma vez.
#include<stdio.h>intmain(void){
int age = 25;
int score = 82;
printf("age: %d score: %d\n", age, score);
return0;
}
O que isso imprime?
age: 25 score: 82
age: %d score: %d
age: 25 score: %d (segundo %d não substituído)
age: 82 score: 25 (ordem trocada)
Explicação: Cada %d na string de formato é preenchido na ordem dos argumentos depois da vírgula.
(1) Primeiro %d ← age (=25)
(2) Segundo %d ← score (=82)
Resposta: age: 25 score: 82
Ponto-chave: Você não precisa de um printf separado para cada variável — uma chamada só pode imprimir quantos valores você quiser. Só garanta que o número de especificadores de formato case com o número de argumentos.
Questão 6 — \n no meio do printf
Você pode colocar \n em qualquer lugar da string de formato para quebrar linhas.
#include<stdio.h>intmain(void){
int x = 3, y = 7;
printf("x = %d\ny = %d\n", x, y);
return0;
}
O que isso imprime?
x = 3 y = 7 (tudo numa linha)
Linha 1: x = 3 / Linha 2: y = 7 (duas linhas)
x = 3\ny = 7\n (\n impresso como texto)
Erro de compilação (só um \n permitido)
Explicação:\n pode aparecer em qualquer lugar da string de formato e significa "vá para a próxima linha" naquele ponto.
Percorrendo "x = %d\ny = %d\n":
(1) Imprime x = 3.
(2) \n → nova linha.
(3) Imprime y = 7.
(4) \n final → nova linha.
Saída: x = 3 y = 7
Ponto-chave: Um único printf pode produzir saída em várias linhas embutindo \n no meio da string.