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

(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 ⭐)

TEXT 📖 Somente leitura
#include <iostream>

int main() {
 int x = 5 // ❌ Falta ponto e vírgula
 std::cout << x << std::endl;
 return 0;
}

Saída:

TEXT 📖 Somente leitura
(Saída do programa)

Mensagem de erro do compilador:

TEXT 📖 Somente leitura
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

CPP
#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:

TEXT 📖 Somente leitura
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

TEXT 📖 Somente leitura
#include <iostream>

int main() {
 x = 5; // ❌ x não foi declarado
 std::cout << x << std::endl;
 return 0;
}

Mensagem de erro do compilador:

TEXT 📖 Somente leitura
error: 'x' was not declared in this scope

Erro 4: Incompatibilidade de Tipos

CPP
#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:

TEXT 📖 Somente leitura
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

(2) 3.2 Erros de Execução Comuns

Erro 1: Divisão por Zero

TEXT 📖 Somente leitura
#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:

CPP
Floating point exception (core dumped) // Linux

Ou

TEXT 📖 Somente leitura
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

CPP
#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:

TEXT 📖 Somente leitura
 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

CPP
#include <iostream>

int main() {
 int x; // ❌ Não inicializada
 std::cout << x << std::endl; // Exibe valor lixo
 return 0;
}

Resultado da execução:

TEXT 📖 Somente leitura
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

(2) 4.2 Erros de Lógica Comuns

Erro 1: Condição Invertida

CPP
#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

CPP
#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

CPP
#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.

CPP
#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:

  1. Definir breakpoints (pausar o programa em uma linha específica)
  2. Executar passo a passo (executar linha por linha)
  3. Observar variáveis (ver valores das variáveis em tempo real)

Passos:

  1. No VS Code, clique na área à esquerda do número da linha para definir um breakpoint (um ponto vermelho aparecerá)
  2. Pressione F5 (ou clique em "Executar e Depurar"), depois selecione "C++ (GDB/LLDB)"
  3. O programa executará e pausará no breakpoint
  4. Pressione F10 para avançar, ou F11 para entrar
  5. 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:

CPP
#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;
}
▶ Experimente

Saída:

TEXT 📖 Somente leitura
Sum of array elements: 15
x not 10

Processo de depuração:

  1. Primeira execução: Programa trava (acesso fora dos limites do array)
  1. Segunda execução: Programa exibe "x is 10" (embora x seja 5)

Programa corrigido:

CPP
#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 ⭐)

CPP
#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;
}
▶ Experimente

Saída:

TEXT 📖 Somente leitura
[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:

TEXT 📖 Somente leitura
[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 .exe faz 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 o launch.json. Verifique: se o gdb está instalado e se o caminho program no launch.json está correto. P: Por que a ordem da saída está errada ao depurar com cout? R: Isso é um problema de buffer. Use std::endl ou std::flush para forçar o esvaziamento do buffer.


📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Corrija o seguinte programa (ele tem 5 bugs):
CPP
#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;
}
  1. Intermediário (Dificuldade ⭐⭐): Escreva um programa que permita ao usuário inserir 10 inteiros e encontre os valores máximo e mínimo.

  2. Use depuração com cout para exibir os valores das variáveis a cada iteração do loop

  3. Introduza intencionalmente um bug (ex.: usar um valor errado para inicializar o máximo), então use depuração para encontrar o problema

  4. Desafio (Dificuldade ⭐⭐⭐): Aprenda a usar o depurador do VS Code:

  5. Defina breakpoints no código do jogo de adivinhação de practice-branch-loop.md

  6. Pressione F5 para iniciar a depuração

  7. Use "executar passo a passo" para executar linha por linha, observando os valores de secretNumber, guess e attempts

  8. Tire um print e me mostre!


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!

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%