Menu
Coddy logo textTech

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.

Autor: Kevin Spektor, Współzałożyciel i CTO

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 / 2 dzieli tylko b, jak w średniej powyżej.
  • Złe porównanie. < tam, gdzie potrzebne było <=, albo and tam, gdzie potrzebne było or. 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 if i elif wygrywa pierwszy prawdziwy warunek, więc szeroki test postawiony na początku zasłania węższe testy pod nim.
  • Zła zmienna. Aktualizowanie total w pętli, ale wyświetlanie subtotal.
  • Założenia o liczbach. 0.1 + 0.2 == 0.3 daje False w Pythonie, Javie i JavaScripcie, bo liczby zmiennoprzecinkowe są przybliżeniami. 7 // 2 to 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ładniBłąd wykonaniaBłąd logiczny
Kiedy się pojawiaPrzed uruchomieniem programuW trakcie działaniaW trakcie działania albo nigdy nie zostaje zauważony
Co go wykrywaParser albo kompilatorŚrodowisko uruchomieniowe albo system operacyjnyCzłowiek albo test
Czy program działa?NieDo błędnej liniiTak, do końca
Komunikat o błędzieTak, z numerem liniiTak, z tracebackiemBrak
Przykład w Pythonieif x > 3 bez dwukropka10 / 0a + b / 2 jako średnia
Jak go znaleźćPrzeczytaj komunikatPrzeczytaj tracebackPoró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

  1. 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.
  2. Wyświetlaj wartości pośrednie. Wyświetlenie score i 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.
  3. Przejdź kod debuggerem. Ustawienie punktu przerwania i wykonywanie linii po linii daje to samo bez edytowania kodu.
  4. 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).
  5. 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?
Błąd składni łamie gramatykę języka, więc program zostaje odrzucony, zanim się uruchomi, a ty dostajesz komunikat z numerem linii. Błąd logiczny idealnie trzyma się gramatyki i program działa do końca, ale wynik jest zły i nie ma żadnego komunikatu. Błąd składni znajdujesz, czytając komunikat; błąd logiczny znajdujesz, testując wynik.
Co to jest błąd logiczny w Pythonie?
To kod w Pythonie, który działa bez tracebacku, ale daje złą odpowiedź. Typowe przykłady to 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.
Jakie jest 5 rodzajów błędów w programowaniu?
Popularna lista pięciu to błędy składni, błędy semantyczne (typów), błędy linkera, błędy wykonania i błędy logiczne. Pierwsze trzy wychodzą podczas budowania programu, błędy wykonania pojawiają się w trakcie jego działania, a błędy logiczne widać tylko jako złe wyniki. Wiele kursów uczy tylko trzech: składni, wykonania i logicznych.
Czy błąd logiczny to bug?
Tak. Bug to każda usterka, przez którą program zachowuje się inaczej, niż zamierzano, a błędy logiczne to najczęstszy rodzaj. Awarie i komunikaty o błędach to też bugi, ale one same dają o sobie znać, a błąd logiczny musi zauważyć człowiek albo test.
Dlaczego błędy logiczne trudno znaleźć?
Bo nic na nie nie wskazuje. Nie ma numeru linii ani komunikatu, a zły wynik może wyglądać wiarygodnie, jak średnia 203 z trzech wyników testu, której nikt nie sprawdzi drugi raz. Znajduje się je, porównując wynik z odpowiedzią, którą już znasz, i dlatego tak ważne są testy ze znanymi wynikami.
Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ