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?
Um erro de sintaxe quebra a gramática da linguagem, então o programa é rejeitado antes de executar e você recebe uma mensagem com o número da linha. Um erro de lógica segue a gramática perfeitamente e executa até o fim, mas o resultado está errado, e não há mensagem nenhuma. Você encontra um erro de sintaxe lendo a mensagem; encontra um erro de lógica testando a saída.
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.Quais são os 5 tipos de erros em programação?
Uma lista comum de cinco é: erros de sintaxe, erros semânticos (de tipo), erros de linker, erros de tempo de execução e erros de lógica. Os três primeiros são encontrados enquanto o programa é construído, os erros de tempo de execução aparecem enquanto ele executa, e os erros de lógica só aparecem como resultados errados. Muitos cursos ensinam só três: sintaxe, execução e lógica.
Um erro de lógica é um bug?
Sim. Um bug é qualquer defeito que faz um programa se comportar de um jeito diferente do pretendido, e os erros de lógica são o tipo mais comum. Travamentos e mensagens de erro também são bugs, mas eles se anunciam, enquanto um erro de lógica precisa ser percebido por uma pessoa ou por um teste.
Por que erros de lógica são difíceis de encontrar?
Porque nada aponta para eles. Não há número de linha nem mensagem, e o resultado errado pode parecer plausível, como uma média de 203 para três notas de prova que ninguém confere. Eles são encontrados comparando a saída com uma resposta que você já conhece, e é por isso que testes com resultados conhecidos importam.