Что такое логическая ошибка?
Логическая ошибка это ошибка в рассуждениях программы, из-за которой она выдаёт неверный результат, но не падает и не показывает никакого сообщения об ошибке. Код правильный, каждая строка выполняется, но делает он не то, что задумал программист.
Обновлено 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 | Нет |
| Пример на Python | if x > 3 без двоеточия | 10 / 0 | a + b / 2 для среднего |
| Как найти | Прочитать сообщение | Прочитать traceback | Сравнить вывод с известным ответом |
В некоторых учебниках видов больше, но большинство из них помещается в эти три. Ошибка типов, которую отвергает компилятор Java, например incompatible types: String cannot be converted to int, находится во время компиляции, как синтаксическая, и в некоторых книгах её называют семантической ошибкой. Ошибка компоновки происходит на последнем шаге сборки программы на C или C++, когда функция объявлена, но её кода нигде нет. Арифметические ошибки, ошибки ресурсов и файлов, например деление на ноль, нехватка памяти или открытие отсутствующего файла, все относятся к ошибкам времени выполнения. Термин «семантическая ошибка» в некоторых курсах используется и как другое название логической ошибки, так что уточняй, в каком значении его использует учебник.
Как найти логическую ошибку
- Проверь на ответе, который уже знаешь. Посчитай правильный результат вручную для небольших входных данных и сравни. Три оценки проверить проще, чем три тысячи.
- Выводи промежуточные значения. Вывод
scoreи выбранной ветки или счётчика цикла на каждом проходе показывает точный шаг, на котором реальность расходится с твоим планом. - Пройди код отладчиком. Точка останова и выполнение по одной строке дают то же самое без правки кода.
- Проверь границы. Попробуй 0, 1, наибольшее значение, пустой список и точное пороговое значение (60 и 90 в примере с оценками).
- Объясни код вслух. Рассказывая о каждой строке кому-то другому или резиновой уточке, ты вынужден говорить, что строка делает на самом деле, а не что ты от неё ждёшь.
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?
range(1, 5), когда нужны числа от 1 до 5 включительно, a + b / 2 вместо (a + b) / 2 и ветки if, проверяемые в неправильном порядке. Python не может их обнаружить, потому что ему неоткуда узнать, что ты имел в виду.