C++: Noções Básicas de Depuração e Erros Comuns
Última atualização: 2026-08-26
Você não consegue escrever código perfeito de primeira — erros são a norma.
Um verdadeiro especialista não é alguém que "nunca comete erros", mas alguém que consegue "encontrar e corrigir erros rapidamente".
Nesta aula, vamos aprender como depurar programas C++.
1. Três Tipos de Erros
Programas C++ têm três tipos de erros, cada um com diferente momento de descoberta e dificuldade de correção.
| Tipo de Erro | Quando Descoberto | Dificuldade de Correção | Exemplo |
|---|---|---|---|
| Erro de compilação | Em tempo de compilação | ⭐ (mais fácil) | Falta de ponto e vírgula, parênteses não correspondentes |
| Erro de execução | Em tempo de execução | ⭐⭐ (moderada) | Divisão por zero, acesso fora dos limites |
| Erro de lógica | Após executar (resultado errado) | ⭐⭐⭐ (mais difícil) | Algoritmo errado, condição invertida |
2. Erros de Compilação (Compiler Error)
(1) 2.1 Características
- Quando descoberto: Em tempo de compilação (ao digitar
g++ xxx.cpp) - Sintoma: O compilador reporta um erro diretamente e não gera o executável
- Correção: Siga a mensagem de erro para encontrar a linha correspondente e corrigir o problema de sintaxe
(2) 2.2 Erros de Compilação Comuns
Erro 1: Falta de Ponto e Vírgula
▶ Exemplo 2: Prática básica de programação (Dificuldade ⭐)
#include <iostream>
int main() {
int x = 5 // ❌ Falta ponto e vírgula
std::cout << x << std::endl;
return 0;
}
Saída:
(Saída do programa)
Mensagem de erro do compilador:
error: expected ';' before 'std'
💡 Dica: O compilador diz "falta ; antes de std", mas o ponto e vírgula que falta está na linha anterior (linha 4).
Erro 2: Parênteses Não Correspondentes
#include <iostream>
int main() {
if (5 > 3 { // ❌ Falta parêntese de fechamento
std::cout << "5 > 3" << std::endl;
}
return 0;
}
Mensagem de erro do compilador:
error: expected ')' before '{' token
💡 Dica: Use o recurso de correspondência de parênteses do VS Code (posicione o cursor sobre um parêntese e o correspondente será destacado).
Erro 3: Variável Não Declarada
#include <iostream>
int main() {
x = 5; // ❌ x não foi declarado
std::cout << x << std::endl;
return 0;
}
Mensagem de erro do compilador:
error: 'x' was not declared in this scope
Erro 4: Incompatibilidade de Tipos
#include <iostream>
int main() {
int x = 3.14; // ⚠️ Aviso: atribuindo double a int, parte fracionária é perdida
std::cout << x << std::endl;
return 0;
}
Mensagem de aviso do compilador:
warning: narrowing conversion of '3.1400000000000001e+0' from 'double' to 'int'
💡 Conselho: Trate avisos como erros! Compile com g++ -Wall -Wextra -Werror para transformar avisos em erros.
3. Erros de Execução (Runtime Error)
(1) 3.1 Características
- Quando descoberto: Compila com sucesso, mas travamenta em tempo de execução
- Sintoma: O programa sai inesperadamente ou exibe dados lixo
- Correção: Requer depuração para encontrar a linha de código que causa o travamento
(2) 3.2 Erros de Execução Comuns
Erro 1: Divisão por Zero
#include <iostream>
int main() {
int x = 5;
int y = 0;
std::cout << x / y << std::endl; // ❌ Divisão por zero, travamento em tempo de execução
return 0;
}
Resultado da execução:
Floating point exception (core dumped) // Linux
Ou
Process ended, exit code -1073741676 // Windows
💡 Correção: Verifique se o divisor é zero antes de realizar a divisão.
Erro 2: Acesso Fora dos Limites do Array
#include <iostream>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
std::cout << arr[10] << std::endl; // ❌ Acessando um elemento inexistente
return 0;
}
Resultado da execução:
0 // Exibe valor lixo, ou o programa trava
💡 Dica: C++ não verifica automaticamente os limites do array! Isso é uma razão pela qual C++ é rápido, mas também é uma fonte comum de bugs.
Erro 3: Variável Não Inicializada
#include <iostream>
int main() {
int x; // ❌ Não inicializada
std::cout << x << std::endl; // Exibe valor lixo
return 0;
}
Resultado da execução:
32767 // Exibe valor lixo (pode diferir a cada execução)
💡 Correção: Inicialize variáveis ao declará-las.
4. Erros de Lógica (Logic Error)
(1) 4.1 Características
- Quando descoberto: O programa executa, mas produz resultados errados
- Sintoma: Nenhuma mensagem de erro óbvia — você precisa comparar os resultados esperados com os reais
- Correção: A mais difícil! Requer verificação cuidadosa da lógica do código
(2) 4.2 Erros de Lógica Comuns
Erro 1: Condição Invertida
#include <iostream>
int main() {
int age;
std::cout << "Please enter your age: ";
std::cin >> age;
if (age < 18) { // ❌ Invertido! Deveria ser age >= 18
std::cout << "You are an adult" << std::endl;
} else {
std::cout << "You are not yet an adult" << std::endl;
}
return 0;
}
💡 Dica de depuração: Use cout para exibir os valores das variáveis-chave e veja por onde o programa passa.
Erro 2: Condição de Loop Errada
#include <iostream>
int main() {
// ❌ Quer exibir 1-10, mas a condição é i < 10, só exibe 1-9
for (int i = 1; i < 10; i++) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
Erro 3: = vs == Invertido
#include <iostream>
int main() {
int x = 5;
if (x = 10) { // ❌ Isso é atribuição, não comparação! x vira 10, condição sempre verdadeira
std::cout << "x is 10" << std::endl;
}
return 0;
}
💡 Dica anti-armadilha: Coloque a constante à esquerda: if (10 = x) causará um erro de compilação.
5. Métodos de Depuração
(1) 5.1 Depuração com cout (Mais Simples)
Adicione cout em posições-chave para exibir valores de variáveis e ver se o programa executa conforme o esperado.
#include <iostream>
int main() {
int x = 5;
int y = 10;
std::cout << "[DEBUG] x = " << x << std::endl; // Saída de depuração
std::cout << "[DEBUG] y = " << y << std::endl;
int sum = x + y;
std::cout << "[DEBUG] sum = " << sum << std::endl;
std::cout << "Result: " << sum << std::endl;
return 0;
}
💡 Dica: Após a depuração, lembre-se de remover (ou comentar) as saídas de depuração.
(2) 5.2 Usando o Depurador da IDE (Mais Poderoso)
VS Code + a extensão C/C++ inclui um depurador que pode:
- Definir breakpoints (pausar o programa em uma linha específica)
- Executar passo a passo (executar linha por linha)
- Observar variáveis (ver valores das variáveis em tempo real)
Passos:
- No VS Code, clique na área à esquerda do número da linha para definir um breakpoint (um ponto vermelho aparecerá)
- Pressione
F5(ou clique em "Executar e Depurar"), depois selecione "C++ (GDB/LLDB)" - O programa executará e pausará no breakpoint
- Pressione
F10para avançar, ouF11para entrar - No painel "Variáveis" à esquerda, você pode ver todos os valores das variáveis
💡 Dica: O depurador é a ferramenta definitiva, mas pode parecer complexo para iniciantes. Recomendamos aprender a depuração com cout primeiro, depois o depurador.
6. Resumo de Erros Comuns
(1) 6.1 Referência Rápida de Erros de Compilação
| Mensagem de Erro | Causa | Correção |
|---|---|---|
expected ';' before ... |
Falta de ponto e vírgula | Adicione um ponto e vírgula no final da linha anterior |
expected ')' before ... |
Falta de parêntese de fechamento | Adicione o parêntese que falta |
was not declared in this scope |
Variável não declarada | Declare a variável primeiro |
undefined reference to ... |
Função não definida | Verifique se há erros de digitação no nome da função |
(2) 6.2 Referência Rápida de Erros de Execução
| Sintoma | Causa | Correção |
|---|---|---|
| Programa sai inesperadamente | Divisão por zero | Verifique o divisor antes de dividir |
| Saída lixo | Acesso fora dos limites do array | Verifique o intervalo de índices do array |
| Números grandes estranhos | Variável não inicializada | Inicialize na declaração |
(3) 6.3 Referência Rápida de Erros de Lógica
| Sintoma | Causa | Correção |
|---|---|---|
| Resultado errado | Condição invertida | Verifique cuidadosamente as condições |
| Contagem de loop errada | Condição de loop errada | Simule a execução do loop no papel |
| Nunca executa | Escreveu = em vez de == |
Coloque constantes à esquerda |
7. Prática: Depurando um Programa com Bugs
▶ Exemplo 1: Encontre os erros no programa (Dificuldade ⭐⭐)
Programa com bugs:
#include <iostream>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
// Quer calcular a soma de todos os elementos do array
int sum = 0;
for (int i = 0; i <= 5; i++) { // ❌ Bug 1: i <= 5 causa acesso fora dos limites
sum += arr[i];
}
std::cout << "Sum of array elements: " << sum << std::endl;
int x = 5;
if (x = 10) { // ❌ Bug 2: = deveria ser ==
std::cout << "x is 10" << std::endl;
}
return 0;
}
Saída:
Sum of array elements: 15
x not 10
Processo de depuração:
- Primeira execução: Programa trava (acesso fora dos limites do array)
- Verifique cuidadosamente o loop
for, descubra quei <= 5deveria seri < 5
- Segunda execução: Programa exibe "x is 10" (embora x seja 5)
- Descubra que
if (x = 10)é uma atribuição, mude paraif (x == 10)
Programa corrigido:
#include <iostream>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int sum = 0;
for (int i = 0; i < 5; i++) { // ✅ Correção: i < 5
sum += arr[i];
}
std::cout << "Sum of array elements: " << sum << std::endl;
int x = 5;
if (x == 10) { // ✅ Correção: ==
std::cout << "x is 10" << std::endl;
} else {
std::cout << "x not 10" << std::endl;
}
return 0;
}
▶ Exemplo 3: Técnica de impressão de depuração (Dificuldade ⭐)
#include <iostream>
int main() {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
// Impressão de depuração: exibir valores a cada iteração
std::cout << "[DEBUG] i=" << i << ", sum=" << sum << std::endl;
}
std::cout << "Final Result: " << sum << std::endl;
return 0;
}
Saída:
[DEBUG] i=1, sum=1
[DEBUG] i=2, sum=3
[DEBUG] i=3, sum=6
[DEBUG] i=4, sum=10
[DEBUG] i=5, sum=15
Final Result: 15
Saída esperada:
[DEBUG] i=1, sum=1
[DEBUG] i=2, sum=3
[DEBUG] i=3, sum=6
[DEBUG] i=4, sum=10
[DEBUG] i=5, sum=15
Final Result: 15
❓ Perguntas Frequentes
P: Por que meu programa compila com sucesso mas não mostra nada ao executar? R: Dois cenários: ① No Windows, dar duplo clique no
.exefaz a janela abrir e fechar rapidamente — isso é normal. Execute no terminal; ② O programa está em loop infinito — pressione Ctrl+C para forçar o encerramento, depois verifique a condição do loop. P: Como configuro o depurador do VS Code? R: Pressione F5 → selecione "C++ (GDB/LLDB)" → VS Code gera automaticamente olaunch.json. Verifique: se o gdb está instalado e se o caminhoprogramnolaunch.jsonestá correto. P: Por que a ordem da saída está errada ao depurar com cout? R: Isso é um problema de buffer. Usestd::endloustd::flushpara forçar o esvaziamento do buffer.
📖 Resumo
- Programas C++ têm três tipos de erros: erros de compilação, erros de execução e erros de lógica
- Erros de compilação são os mais fáceis de corrigir (basta seguir a mensagem de erro)
- Erros de execução exigem verificação cuidadosa (divisão por zero, acesso fora dos limites)
- Erros de lógica são os mais difíceis de encontrar (use
coutou um depurador) - Técnicas de depuração:
- Use
coutpara exibir valores de variáveis-chave - Use o depurador da IDE para definir breakpoints e executar passo a passo
- Trate avisos como erros (
-Wall -Wextra -Werror)
- Use
📝 Exercícios
- Básico (Dificuldade ⭐): Corrija o seguinte programa (ele tem 5 bugs):
#include <iostream>
int main() {
int x = 5
int y = 10;
if (x = y) {
std::cout << "x and y are equal" << std::endl;
}
for (int i = 0; i <= 10; i++) {
std::cout << i << " ";
}
return 0;
}
-
Intermediário (Dificuldade ⭐⭐): Escreva um programa que permita ao usuário inserir 10 inteiros e encontre os valores máximo e mínimo.
-
Use depuração com
coutpara exibir os valores das variáveis a cada iteração do loop -
Introduza intencionalmente um bug (ex.: usar um valor errado para inicializar o máximo), então use depuração para encontrar o problema
-
Desafio (Dificuldade ⭐⭐⭐): Aprenda a usar o depurador do VS Code:
-
Defina breakpoints no código do jogo de adivinhação de
practice-branch-loop.md -
Pressione
F5para iniciar a depuração -
Use "executar passo a passo" para executar linha por linha, observando os valores de
secretNumber,guesseattempts -
Tire um print e me mostre!
- Três tipos de erros: erros de compilação, erros de execução, erros de lógica
- Erros de compilação são os mais fáceis de corrigir — basta seguir a mensagem de erro
- Erros de execução: divisão por zero, acesso fora dos limites
- Erros de lógica são os mais difíceis de encontrar — use cout ou depurador para investigar passo a passo
- Compile com -Wall -Wextra para habilitar todos os avisos
8. 🚀 Próximos Passos
Parabéns! Você completou todas as aulas da Fase 1 (Introdução). Agora você domina o básico do C++ — variáveis, tipos de dados, operadores, declarações condicionais, loops e depuração.
A seguir, entraremos na Fase 2 (Funções), aprendendo como empacotar código em módulos reutilizáveis para tornar seus programas mais organizados e fáceis de manter!