Что такое логическая ошибка?
Логическая ошибка это ошибка в рассуждениях программы, из-за которой она выдаёт неверный результат, но не падает и не показывает никакого сообщения об ошибке. Код правильный, каждая строка выполняется, но делает он не то, что задумал программист.
Обновлено 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 не может их обнаружить, потому что ему неоткуда узнать, что ты имел в виду.Какие 5 видов ошибок бывают в программировании?
Распространённый список из пяти: синтаксические ошибки, семантические ошибки (ошибки типов), ошибки компоновки, ошибки времени выполнения и логические ошибки. Первые три обнаруживаются при сборке программы, ошибки времени выполнения появляются во время её работы, а логические видны только по неверным результатам. Многие курсы учат только трём: синтаксическим, ошибкам времени выполнения и логическим.
Логическая ошибка это баг?
Да. Баг это любой дефект, из-за которого программа ведёт себя не так, как задумано, а логические ошибки самый частый его вид. Падения и сообщения об ошибках тоже баги, но они заявляют о себе сами, а логическую ошибку должен заметить человек или тест.
Почему логические ошибки трудно найти?
Потому что на них ничто не указывает. Нет номера строки и нет сообщения, а неверный результат может выглядеть правдоподобно, например среднее 203 для трёх оценок, которое никто не перепроверяет. Их находят, сравнивая вывод с заранее известным ответом, и поэтому так важны тесты с известными результатами.