Co to jest błąd logiczny?
Błąd logiczny to pomyłka w rozumowaniu programu, przez którą daje on zły wynik, choć się nie wysypuje i nie pokazuje żadnego komunikatu o błędzie. Kod jest poprawny i każda linia się wykonuje, ale program nie robi tego, co zamierzał programista.
Aktualizacja: 24 września 2026
Trzy wyniki testu, 80, 90 i 100, mają średnią 90. Ten program działa bez żadnej skargi i wyświetla coś innego:
Average: 203.33333333333334
Python zrobił dokładnie to, co mówi ta linia. Dzielenie wykonuje się przed dodawaniem, więc przez 3 został podzielony tylko ostatni wynik, a wynikiem jest 80 + 90 + 33,33. Programista miał na myśli (scores[0] + scores[1] + scores[2]) / 3. Dodaj nawiasy, a program wyświetli Average: 90.0.
Dlaczego nie pojawia się komunikat o błędzie
Komputer sprawdza, czy kod jest poprawny formalnie, a nie czy robi to, co trzeba. Parser sprawdza gramatykę, co wyłapuje błąd składni. Środowisko uruchomieniowe sprawdza każdą operację, co wyłapuje błąd wykonania, taki jak dzielenie przez zero. Dodanie trzech liczb i podzielenie jednej z nich przez 3 to poprawna gramatyka i dozwolona operacja, więc oba sprawdzenia przechodzą.
Tylko osoba, która napisała program, wie, że miał on obliczać średnią. Ten zamiar nie istnieje nigdzie w kodzie, więc żadne narzędzie nie może porównać z nim wyniku. Błąd logiczny to różnica między tym, co twój kod każe zrobić komputerowi, a tym, czego chcesz.
Typowe przyczyny błędów logicznych
Większość błędów logicznych bierze się z krótkiej listy wzorców.
- Pomyłki o jeden. Pętla wykonuje się raz za dużo albo raz za mało.
range(1, 5)daje 1, 2, 3 i 4, bo koniec jest wykluczony. Zobacz iterację. - Kolejność operatorów.
a + b / 2dzieli tylkob, jak w średniej powyżej. - Złe porównanie.
<tam, gdzie potrzebne było<=, alboandtam, gdzie potrzebne byłoor. Warunki to wyrażenia typu boolean, a jeden zły operator odwraca wynik dla niektórych danych. - Warunki w złej kolejności. W łańcuchu
ifielifwygrywa pierwszy prawdziwy warunek, więc szeroki test postawiony na początku zasłania węższe testy pod nim. - Zła zmienna. Aktualizowanie
totalw pętli, ale wyświetlaniesubtotal. - Założenia o liczbach.
0.1 + 0.2 == 0.3dajeFalsew Pythonie, Javie i JavaScripcie, bo liczby zmiennoprzecinkowe są przybliżeniami.7 // 2to 3, a nie 3,5.
Oto pomyłka w kolejności warunków. Wynik 95 powinien dać ocenę A:
D
D
F
95 jest większe lub równe 60, więc wygrywa pierwsza gałąź, a do elif program nigdy nie dochodzi. Postaw najwyższy próg na początku, a każdy wynik będzie poprawny.
Rodzaje błędów w programowaniu
Błędy w programowaniu zwykle dzieli się na trzy rodzaje według tego, kiedy się pojawiają i co je zgłasza.
| Błąd składni | Błąd wykonania | Błąd logiczny | |
|---|---|---|---|
| Kiedy się pojawia | Przed uruchomieniem programu | W trakcie działania | W trakcie działania albo nigdy nie zostaje zauważony |
| Co go wykrywa | Parser albo kompilator | Środowisko uruchomieniowe albo system operacyjny | Człowiek albo test |
| Czy program działa? | Nie | Do błędnej linii | Tak, do końca |
| Komunikat o błędzie | Tak, z numerem linii | Tak, z tracebackiem | Brak |
| Przykład w Pythonie | if x > 3 bez dwukropka | 10 / 0 | a + b / 2 jako średnia |
| Jak go znaleźć | Przeczytaj komunikat | Przeczytaj traceback | Porównaj wynik ze znaną odpowiedzią |
Niektóre podręczniki wymieniają więcej rodzajów, ale większość z nich mieści się w tych trzech. Błąd typu, który odrzuca kompilator Javy, na przykład incompatible types: String cannot be converted to int, wychodzi w czasie kompilacji jak błąd składni, a niektóre książki nazywają go błędem semantycznym. Błąd linkera pojawia się w ostatnim kroku budowania programu w C albo C++, gdy funkcja została zadeklarowana, ale jej kodu nigdzie nie ma. Błędy arytmetyczne, błędy zasobów i błędy plików, takie jak dzielenie przez zero, brak pamięci albo otwarcie nieistniejącego pliku, to wszystko błędy wykonania. Niektóre kursy używają też określenia "błąd semantyczny" jako innej nazwy błędu logicznego, więc sprawdź, w jakim znaczeniu używa go dany podręcznik.
Jak znaleźć błąd logiczny
- Testuj na odpowiedzi, którą już znasz. Oblicz ręcznie poprawny wynik dla małych danych, a potem porównaj. Trzy wyniki łatwiej sprawdzić niż trzy tysiące.
- Wyświetlaj wartości pośrednie. Wyświetlenie
scorei wybranej gałęzi albo licznika pętli w każdym przejściu pokazuje dokładny krok, w którym rzeczywistość rozjeżdża się z twoim planem. - Przejdź kod debuggerem. Ustawienie punktu przerwania i wykonywanie linii po linii daje to samo bez edytowania kodu.
- Testuj przypadki brzegowe. Wypróbuj 0, 1, największą wartość, pustą listę i dokładną wartość progu (60 i 90 w przykładzie z ocenami).
- Wytłumacz kod na głos. Opisywanie każdej linii komuś innemu, albo gumowej kaczce, zmusza cię do powiedzenia, co linia robi, a nie co zakładasz, że robi.
assert zamienia znaną odpowiedź w automatyczne sprawdzenie. Nie robi nic, gdy warunek jest prawdziwy, i zatrzymuje program, gdy jest fałszywy:
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
Nieudany test zamienia cichy błąd logiczny w głośny, z numerem linii. Na tym właśnie polega cała idea testów jednostkowych.
Błędy logiczne w innych językach
Wzorce są wszędzie takie same, ale każdy język ma własne pułapki. W JavaScripcie "5" + 3 to napis "53", a "5" - 3 to liczba 2, więc wartość odczytana z formularza jako tekst może się źle zsumować bez żadnego błędu. W C if (x = 5) przypisuje 5 do x i zawsze jest prawdziwe. Clang domyślnie ostrzega przed tym (using the result of an assignment as a condition without parentheses), ale kod i tak się kompiluje i działa, więc traktuj ostrzeżenia kompilatora tak poważnie jak błędy.
Co dalej
Porównaj tę stronę ze stronami o błędzie składni i błędzie wykonania, żeby zobaczyć, jak zgłaszany jest każdy rodzaj. Pomyłki o jeden najczęściej zdarzają się w pętlach, więc dobrą kolejną lekturą jest strona o iteracji i przewodnik po pętlach for w Pythonie. Żeby poćwiczyć szukanie złych wyników w prawdziwych zadaniach, wypróbuj kurs Python.
Najczęściej zadawane pytania
Czym różni się błąd składni od błędu logicznego?
Co to jest błąd logiczny w Pythonie?
range(1, 5), gdy chodziło o liczby od 1 do 5 włącznie, a + b / 2, gdy chodziło o (a + b) / 2, oraz gałęzie if sprawdzane w złej kolejności. Python nie może ich wykryć, bo nie ma jak poznać twojego zamiaru.