Menu
Coddy logo textTech

Что такое логическая ошибка?

Логическая ошибка это ошибка в рассуждениях программы, из-за которой она выдаёт неверный результат, но не падает и не показывает никакого сообщения об ошибке. Код правильный, каждая строка выполняется, но делает он не то, что задумал программист.

Автор: Kevin Spektor, Сооснователь и CTO

Обновлено 24 сентября 2026 г.

У трёх оценок, 80, 90 и 100, среднее равно 90. Эта программа выполняется без единой жалобы и выводит другое:

Average: 203.33333333333334

Python сделал ровно то, что написано в строке. Деление выполняется раньше сложения, поэтому на 3 поделилась только последняя оценка, и результат равен 80 + 90 + 33,33. Программист имел в виду (scores[0] + scores[1] + scores[2]) / 3. Добавь скобки, и программа выведет Average: 90.0.

Почему не появляется сообщение об ошибке

Компьютер проверяет, допустим ли код, а не правилен ли он. Парсер проверяет грамматику и ловит синтаксическую ошибку. Среда выполнения проверяет каждую операцию и ловит ошибку времени выполнения, например деление на ноль. Сложить три числа и одно из них поделить на 3 можно и по грамматике, и по правилам операций, поэтому обе проверки пройдены.

Только тот, кто написал программу, знает, что она должна была посчитать среднее. Этого намерения нет нигде в коде, поэтому ни один инструмент не может сравнить с ним результат. Логическая ошибка это разрыв между тем, что ты велел компьютеру сделать, и тем, чего ты хотел.

Частые причины логических ошибок

Большинство логических ошибок укладываются в короткий список шаблонов.

  • Ошибки на единицу (off-by-one). Цикл выполняется на один раз больше или меньше нужного. range(1, 5) даёт 1, 2, 3 и 4, потому что конец не включается. Подробнее на странице про итерацию.
  • Приоритет операторов. a + b / 2 делит только b, как в примере со средним выше.
  • Не то сравнение. < там, где нужно <=, или and там, где нужно or. Условия это булевы (boolean) выражения, и один неверный оператор переворачивает результат для части входных данных.
  • Условия в неправильном порядке. В цепочке if и elif побеждает первое истинное условие, поэтому широкая проверка, поставленная первой, скрывает более узкие под ней.
  • Не та переменная. Внутри цикла обновляется total, а выводится subtotal.
  • Предположения о числах. 0.1 + 0.2 == 0.3 в Python, Java и JavaScript равно False, потому что числа с плавающей точкой приближённые. 7 // 2 равно 3, а не 3,5.

Вот ошибка с порядком условий. Оценка 95 должна быть A:

D
D
F

95 больше или равно 60, поэтому побеждает первая ветка, и до elif дело не доходит. Поставь самый высокий порог первым, и все результаты станут правильными.

Виды ошибок в программировании

Ошибки в программировании обычно делят на три вида по тому, когда они появляются и кто о них сообщает.

Синтаксическая ошибкаОшибка времени выполненияЛогическая ошибка
Когда появляетсяДо запуска программыВо время работыВо время работы или остаётся незамеченной
Кто обнаруживаетПарсер или компиляторСреда выполнения или операционная системаЧеловек или тест
Работает ли программа?НетДо строки с ошибкойДа, до конца
Сообщение об ошибкеДа, с номером строкиДа, с tracebackНет
Пример на Pythonif x > 3 без двоеточия10 / 0a + b / 2 для среднего
Как найтиПрочитать сообщениеПрочитать tracebackСравнить вывод с известным ответом

В некоторых учебниках видов больше, но большинство из них помещается в эти три. Ошибка типов, которую отвергает компилятор Java, например incompatible types: String cannot be converted to int, находится во время компиляции, как синтаксическая, и в некоторых книгах её называют семантической ошибкой. Ошибка компоновки происходит на последнем шаге сборки программы на C или C++, когда функция объявлена, но её кода нигде нет. Арифметические ошибки, ошибки ресурсов и файлов, например деление на ноль, нехватка памяти или открытие отсутствующего файла, все относятся к ошибкам времени выполнения. Термин «семантическая ошибка» в некоторых курсах используется и как другое название логической ошибки, так что уточняй, в каком значении его использует учебник.

Как найти логическую ошибку

  1. Проверь на ответе, который уже знаешь. Посчитай правильный результат вручную для небольших входных данных и сравни. Три оценки проверить проще, чем три тысячи.
  2. Выводи промежуточные значения. Вывод score и выбранной ветки или счётчика цикла на каждом проходе показывает точный шаг, на котором реальность расходится с твоим планом.
  3. Пройди код отладчиком. Точка останова и выполнение по одной строке дают то же самое без правки кода.
  4. Проверь границы. Попробуй 0, 1, наибольшее значение, пустой список и точное пороговое значение (60 и 90 в примере с оценками).
  5. Объясни код вслух. Рассказывая о каждой строке кому-то другому или резиновой уточке, ты вынужден говорить, что строка делает на самом деле, а не что ты от неё ждёшь.

assert превращает известный ответ в автоматическую проверку. Когда условие истинно, он ничего не делает, а когда ложно, останавливает программу:

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

Упавший тест превращает тихую логическую ошибку в громкую, с номером строки. В этом и состоит вся идея модульного тестирования.

Логические ошибки в других языках

Шаблоны везде одни и те же, но у каждого языка свои ловушки. В JavaScript "5" + 3 это строка "53", а "5" - 3 это число 2, поэтому значение, прочитанное из формы как текст, может сложиться неправильно без всякой ошибки. В C if (x = 5) присваивает x значение 5 и всегда истинно. Clang по умолчанию предупреждает об этом (using the result of an assignment as a condition without parentheses), но код всё равно компилируется и работает, поэтому относись к предупреждениям компилятора так же серьёзно, как к ошибкам.

Что читать дальше

Сравни эту страницу со страницами про синтаксическую ошибку и ошибку времени выполнения, чтобы увидеть, как сообщается о каждом виде. Ошибки на единицу живут в циклах, поэтому дальше стоит прочитать страницу про итерацию и руководство по Python о циклах for. Чтобы потренироваться находить неверные результаты на настоящих упражнениях, попробуй курс Python.

Часто задаваемые вопросы

Чем синтаксическая ошибка отличается от логической?
Синтаксическая ошибка нарушает грамматику языка, поэтому программа отвергается до запуска, и ты получаешь сообщение с номером строки. Логическая ошибка полностью соответствует грамматике и выполняется до конца, но результат неверный, и никакого сообщения нет. Синтаксическую ошибку находят, читая сообщение; логическую находят, проверяя результат.
Что такое логическая ошибка в Python?
Это код на Python, который выполняется без traceback, но даёт неверный ответ. Типичные примеры: range(1, 5), когда нужны числа от 1 до 5 включительно, a + b / 2 вместо (a + b) / 2 и ветки if, проверяемые в неправильном порядке. Python не может их обнаружить, потому что ему неоткуда узнать, что ты имел в виду.
Какие 5 видов ошибок бывают в программировании?
Распространённый список из пяти: синтаксические ошибки, семантические ошибки (ошибки типов), ошибки компоновки, ошибки времени выполнения и логические ошибки. Первые три обнаруживаются при сборке программы, ошибки времени выполнения появляются во время её работы, а логические видны только по неверным результатам. Многие курсы учат только трём: синтаксическим, ошибкам времени выполнения и логическим.
Логическая ошибка это баг?
Да. Баг это любой дефект, из-за которого программа ведёт себя не так, как задумано, а логические ошибки самый частый его вид. Падения и сообщения об ошибках тоже баги, но они заявляют о себе сами, а логическую ошибку должен заметить человек или тест.
Почему логические ошибки трудно найти?
Потому что на них ничто не указывает. Нет номера строки и нет сообщения, а неверный результат может выглядеть правдоподобно, например среднее 203 для трёх оценок, которое никто не перепроверяет. Их находят, сравнивая вывод с заранее известным ответом, и поэтому так важны тесты с известными результатами.
Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ