O que é um erro de lógica?
Um erro de lógica é uma falha no raciocínio de um programa que faz ele produzir o resultado errado sem travar nem mostrar nenhuma mensagem de erro. O código é válido e todas as linhas executam, mas ele não faz o que o programador pretendia.
Atualizado em 24 de setembro de 2026
Três notas de prova, 80, 90 e 100, têm média 90. Este programa executa sem uma única reclamação e imprime outra coisa:
Average: 203.33333333333334
O Python fez exatamente o que a linha diz. A divisão acontece antes da soma, então só a última nota foi dividida por 3, e o resultado é 80 + 90 + 33,33. O programador queria (scores[0] + scores[1] + scores[2]) / 3. Coloque os parênteses e o programa imprime Average: 90.0.
Por que nenhuma mensagem de erro aparece
Um computador verifica se o código é válido, não se ele está correto. O parser verifica a gramática, o que detecta um erro de sintaxe. O runtime verifica cada operação, o que detecta um erro de tempo de execução como dividir por zero. Somar três números e dividir um deles por 3 é gramática válida e uma operação permitida, então as duas verificações passam.
Só quem escreveu o programa sabe que ele deveria calcular uma média. Essa intenção não existe em lugar nenhum do código, então nenhuma ferramenta consegue comparar o resultado com ela. Um erro de lógica é a distância entre o que você mandou o computador fazer e o que você queria que ele fizesse.
Causas comuns de erros de lógica
A maioria dos erros de lógica vem de uma lista curta de padrões.
- Erros de um a mais ou a menos (off-by-one). Um loop executa uma vez a mais ou a menos.
range(1, 5)produz 1, 2, 3 e 4, porque o fim é excluído. Veja iteração. - Precedência de operadores.
a + b / 2divide sób, como na média acima. - A comparação errada.
<onde era preciso<=, ouandonde era precisoor. Condições são expressões booleanas, e um único operador errado inverte o resultado para algumas entradas. - Condições na ordem errada. Em uma cadeia de
ifeelif, a primeira condição verdadeira vence, então um teste amplo colocado primeiro esconde os mais específicos abaixo dele. - A variável errada. Atualizar
totaldentro de um loop, mas imprimirsubtotal. - Suposições sobre números.
0.1 + 0.2 == 0.3éFalseem Python, Java e JavaScript, porque números de ponto flutuante são aproximações.7 // 2é 3, não 3,5.
Aqui está o erro de ordem das condições. Uma nota 95 deveria ser um A:
D
D
F
95 é maior ou igual a 60, então o primeiro ramo vence e o elif nunca é alcançado. Coloque o limite mais alto primeiro e todos os resultados ficam certos.
Tipos de erros em programação
Os erros de programação costumam ser classificados em três tipos, conforme quando aparecem e o que os informa.
| Erro de sintaxe | Erro de tempo de execução | Erro de lógica | |
|---|---|---|---|
| Quando aparece | Antes de o programa executar | Enquanto executa | Enquanto executa, ou nunca é percebido |
| O que detecta | O parser ou o compilador | O runtime ou o sistema operacional | Uma pessoa ou um teste |
| O programa executa? | Não | Até a linha que falha | Sim, até o fim |
| Mensagem de erro | Sim, com número de linha | Sim, com traceback | Nenhuma |
| Exemplo em Python | if x > 3 sem os dois-pontos | 10 / 0 | a + b / 2 para uma média |
| Como encontrar | Ler a mensagem | Ler o traceback | Comparar a saída com uma resposta conhecida |
Alguns livros listam mais tipos, e a maioria deles cabe dentro destes três. Um erro de tipo que o compilador Java rejeita, como incompatible types: String cannot be converted to int, é encontrado em tempo de compilação como um erro de sintaxe, e alguns livros o chamam de erro semântico. Um erro de linker acontece na última etapa da construção de um programa em C ou C++, quando uma função foi declarada mas o código dela não está em lugar nenhum. Erros aritméticos, de recursos e de arquivo, como dividir por zero, ficar sem memória ou abrir um arquivo inexistente, são todos erros de tempo de execução. O termo "erro semântico" também é usado por alguns cursos como outro nome para erro de lógica, então confira qual significado o livro usa.
Como encontrar um erro de lógica
- Teste com uma resposta que você já conhece. Calcule à mão o resultado correto para uma entrada pequena e depois compare. Três notas são mais fáceis de conferir do que três mil.
- Imprima os valores intermediários. Imprimir
scoree o ramo escolhido, ou o contador do loop a cada passagem, mostra o passo exato em que a realidade se afasta do seu plano. - Avance passo a passo com um depurador. Colocar um breakpoint e executar uma linha de cada vez faz o mesmo sem editar o código.
- Teste os limites. Experimente 0, 1, o maior valor, uma lista vazia e o limite exato (60 e 90 no exemplo das notas).
- Explique o código em voz alta. Descrever cada linha para outra pessoa, ou para um patinho de borracha, obriga você a dizer o que a linha faz, e não o que você supõe que ela faz.
Um assert transforma uma resposta conhecida em uma verificação automática. Ele não faz nada quando a condição é verdadeira e para o programa quando ela é falsa:
Traceback (most recent call last):
File "main.py", line 10, in <module>
assert grade(95) == "A", "95 should be an A"
^^^^^^^^^^^^^^^^
AssertionError: 95 should be an A
Um teste que falha transforma um erro de lógica silencioso em um erro barulhento, com número de linha. Essa é toda a ideia por trás dos testes unitários.
Erros de lógica em outras linguagens
Os padrões são os mesmos em todo lugar, mas cada linguagem tem as próprias armadilhas. Em JavaScript, "5" + 3 é a string "53", enquanto "5" - 3 é o número 2, então um valor lido de um formulário como texto pode somar errado sem nenhum erro. Em C, if (x = 5) atribui 5 a x e é sempre verdadeiro. O Clang avisa sobre isso por padrão (using the result of an assignment as a condition without parentheses), mas o código ainda compila e executa, então leve os avisos do compilador tão a sério quanto os erros.
Próximos passos
Compare esta página com as páginas de erro de sintaxe e erro de tempo de execução para ver como cada tipo é informado. Os loops são onde moram os erros de um a mais ou a menos, então a página de iteração e o guia de Python sobre loops for são boas leituras a seguir. Para praticar encontrar resultados errados em exercícios reais, experimente o curso de Python.
Perguntas frequentes
Qual é a diferença entre erro de sintaxe e erro de lógica?
O que é um erro de lógica em Python?
range(1, 5) quando você queria de 1 a 5 inclusive, a + b / 2 quando você queria (a + b) / 2, e ramos if verificados na ordem errada. O Python não consegue detectá-los, porque não tem como saber o que você quis dizer.