Transforme o tempo que você gasta olhando o código em tempo vendo os valores das variáveis. A habilidade de depuração mais prática para iniciantes.
printf("x=%d\n", x);[DEBUG] para dar grep depois\n)// Coloque printfs em qualquer lugar suspeito. printf("[DEBUG] i=%d, sum=%d\n", i, sum);
for (int i = 0; i < 5; i++) { sum = sum + arr[i]; printf("[DEBUG] i=%d, arr[i]=%d, sum=%d\n", i, arr[i], sum); // ← isso }
int calc(int a, int b) { printf("[DEBUG] entrada calc: a=%d, b=%d\n", a, b); int result = a * 2 + b; printf("[DEBUG] saida calc: result=%d\n", result); return result; }
ifprintf("[DEBUG] antes do teste: score=%d\n", score); if (score >= 60) { printf("[DEBUG] ramo aprovado\n"); printf("Aprovado\n"); } else { printf("[DEBUG] ramo reprovado\n"); printf("Reprovado\n"); }
int sum = 0; for (int i = 1; i < 10; i++) { sum = sum + i; } printf("Soma = %d\n", sum); // Saida: Soma = 45 // "Ué, nao deveria ser 55?" // ...encara o codigo por 10 minutos... // ...ainda sem entender...
int sum = 0; for (int i = 1; i < 10; i++) { sum = sum + i; printf("[D] i=%d sum=%d\n", i, sum); } printf("Soma = %d\n", sum); // Saida: // [D] i=1 sum=1 // [D] i=2 sum=3 // ... // [D] i=9 sum=45 ← i para em 9, nao 10! // Soma = 45
i < 10 e i <= 10 fica nebulosa na cabeça, e o bug nunca é corrigido.%d e %f).char, strings, ponteiros e hex são cobertos em aulas posteriores (Strings, Ponteiros, Bit a bit etc.). Por ora, int → %d, double → %f é tudo que você precisa.
| Tipo | Especificador | Exemplo | Saída |
|---|---|---|---|
int ★ use agora | %d | printf("%d", x) | 42 |
float / double ★ use agora | %f | printf("%.2f", z) | 3.14 |
long | %ld | printf("%ld", y) | 1234567890 |
char depois | %c | printf("%c", c) | A |
char[] / string depois | %s | printf("%s", s) | Hello |
| ponteiro/endereço depois | %p | printf("%p", p) | 0x7ffee... |
| hex depois | %x | printf("%x", n) | ff |
printf("[D] var1=%d var2=%d\n", var1, var2); onde precisar e troque pelos nomes das suas variáveis. Não esqueça do \n (veja a próxima seção).\n faltando atrasa sua saídaprintf faz buffering da saída por eficiência e só libera numa nova linha \n (line buffering).
printf("[D] cheguei aqui"); // ← sem \n → nao aparece nada na tela ainda! // Se o programa crashar depois dessa linha, voce vai concluir // "nunca chegamos nesse ponto" — mesmo tendo chegado.
\n, ou chame fflush(stdout); logo depois.double x = 3.14; printf("%d\n", x); // ❌ %d eh para int — comportamento indefinido
-Wall para o compilador avisar sobre incompatibilidades.[DEBUG] ou [D]. Assim um único grep por [D] encontra todos.Teste seu entendimento desta aula!
int em decimal?%d é para inteiros decimais, %f é para ponto flutuante, e %s é para strings.
\n é nova linha, \t é tabulação e \\ é uma barra invertida literal.
%p formata um void * como hexadecimal com segurança. Usar %d é definido pela implementação e inseguro.