Was ist ein Logikfehler?
Ein Logikfehler ist ein Denkfehler in einem Programm, durch den es ein falsches Ergebnis liefert, ohne abzustürzen oder eine Fehlermeldung zu zeigen. Der Code ist gültig und jede Zeile läuft, aber er tut nicht, was der Programmierer beabsichtigt hat.
Aktualisiert am 24. September 2026
Drei Testergebnisse, 80, 90 und 100, haben einen Durchschnitt von 90. Dieses Programm läuft ohne eine einzige Beschwerde und gibt etwas anderes aus:
Average: 203.33333333333334
Python hat genau das getan, was in der Zeile steht. Division kommt vor Addition, also wurde nur das letzte Ergebnis durch 3 geteilt, und das Ergebnis ist 80 + 90 + 33,33. Gemeint war (scores[0] + scores[1] + scores[2]) / 3. Setz die Klammern, und das Programm gibt Average: 90.0 aus.
Warum keine Fehlermeldung erscheint
Ein Computer prüft, ob Code gültig ist, nicht, ob er richtig ist. Der Parser prüft die Grammatik und fängt damit einen Syntaxfehler. Die Laufzeitumgebung prüft jede Operation und fängt damit einen Laufzeitfehler wie eine Division durch null. Drei Zahlen zu addieren und eine davon durch 3 zu teilen ist gültige Grammatik und eine erlaubte Operation, also bestehen beide Prüfungen.
Nur die Person, die das Programm geschrieben hat, weiß, dass es einen Durchschnitt berechnen sollte. Diese Absicht steht nirgends im Code, also kann kein Werkzeug das Ergebnis damit vergleichen. Ein Logikfehler ist die Lücke zwischen dem, was du dem Computer gesagt hast, und dem, was du wolltest.
Typische Ursachen für Logikfehler
Die meisten Logikfehler stammen aus einer kurzen Liste von Mustern.
- Off-by-one-Fehler. Eine Schleife läuft einmal zu oft oder zu selten.
range(1, 5)liefert 1, 2, 3 und 4, weil das Ende ausgeschlossen ist. Siehe Iteration. - Operatorrangfolge.
a + b / 2teilt nurb, wie beim Durchschnitt oben. - Der falsche Vergleich.
<, wo<=nötig war, oderand, woornötig war. Bedingungen sind boolesche Ausdrücke, und ein falscher Operator kehrt das Ergebnis für manche Eingaben um. - Bedingungen in der falschen Reihenfolge. In einer Kette aus
ifundelifgewinnt die erste wahre Bedingung, also verdeckt ein breiter Test am Anfang die engeren darunter. - Die falsche Variable. In einer Schleife
totalaktualisieren, abersubtotalausgeben. - Annahmen über Zahlen.
0.1 + 0.2 == 0.3ist in Python, Java und JavaScriptFalse, weil Gleitkommazahlen Näherungen sind.7 // 2ist 3, nicht 3,5.
Hier ist der Fehler mit der Reihenfolge der Bedingungen. Eine Punktzahl von 95 sollte ein A sein:
D
D
F
95 ist größer oder gleich 60, also gewinnt der erste Zweig, und das elif wird nie erreicht. Setz die höchste Schwelle an den Anfang, und jedes Ergebnis stimmt.
Fehlerarten beim Programmieren
Programmierfehler werden meist in drei Arten eingeteilt, je nachdem, wann sie auftreten und was sie meldet.
| Syntaxfehler | Laufzeitfehler | Logikfehler | |
|---|---|---|---|
| Wann er auftritt | Bevor das Programm läuft | Während es läuft | Während es läuft, oder er fällt nie auf |
| Was ihn erkennt | Der Parser oder der Compiler | Die Laufzeitumgebung oder das Betriebssystem | Eine Person oder ein Test |
| Läuft das Programm? | Nein | Bis zur fehlschlagenden Zeile | Ja, bis zum Ende |
| Fehlermeldung | Ja, mit Zeilennummer | Ja, mit Traceback | Keine |
| Beispiel in Python | if x > 3 ohne Doppelpunkt | 10 / 0 | a + b / 2 für einen Durchschnitt |
| Wie du ihn findest | Die Meldung lesen | Den Traceback lesen | Die Ausgabe mit einer bekannten Antwort vergleichen |
Manche Lehrbücher nennen mehr Arten, und die meisten davon passen in diese drei. Ein Typfehler, den der Java-Compiler ablehnt, etwa incompatible types: String cannot be converted to int, wird wie ein Syntaxfehler beim Kompilieren gefunden, und manche Bücher nennen ihn einen semantischen Fehler. Ein Linkerfehler passiert im letzten Schritt beim Bauen eines C- oder C++-Programms, wenn eine Funktion deklariert wurde, ihr Code aber nirgends zu finden ist. Arithmetik-, Ressourcen- und Dateifehler, etwa eine Division durch null, zu wenig Speicher oder das Öffnen einer fehlenden Datei, sind alles Laufzeitfehler. Den Begriff "semantischer Fehler" verwenden manche Kurse auch als anderen Namen für einen Logikfehler, prüf also, welche Bedeutung ein Lehrbuch meint.
Wie du einen Logikfehler findest
- Teste mit einer Antwort, die du schon kennst. Rechne das richtige Ergebnis für eine kleine Eingabe von Hand aus und vergleiche dann. Drei Ergebnisse lassen sich leichter prüfen als dreitausend.
- Gib die Zwischenwerte aus. Wenn du
scoreund den gewählten Zweig oder den Schleifenzähler bei jedem Durchlauf ausgibst, siehst du den genauen Schritt, an dem die Wirklichkeit von deinem Plan abweicht. - Geh mit einem Debugger Schritt für Schritt durch. Einen Breakpoint setzen und Zeile für Zeile ausführen erreicht dasselbe, ohne den Code zu ändern.
- Teste die Ränder. Probier 0, 1, den größten Wert, eine leere Liste und genau die Schwelle (60 und 90 im Notenbeispiel).
- Erklär den Code laut. Wenn du jede Zeile jemand anderem oder einer Quietscheente beschreibst, musst du sagen, was die Zeile tut, statt was du annimmst, dass sie tut.
Ein assert macht aus einer bekannten Antwort eine automatische Prüfung. Es tut nichts, wenn die Bedingung wahr ist, und hält das Programm an, wenn sie falsch ist:
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
Ein fehlschlagender Test macht aus einem stillen Logikfehler einen lauten mit Zeilennummer. Genau das ist die Idee hinter Unit-Tests.
Logikfehler in anderen Sprachen
Die Muster sind überall gleich, aber jede Sprache hat ihre eigenen Fallen. In JavaScript ist "5" + 3 der String "53", während "5" - 3 die Zahl 2 ist, also kann ein Wert, der als Text aus einem Formular gelesen wird, ohne jeden Fehler falsch aufsummiert werden. In C weist if (x = 5) der Variablen x den Wert 5 zu und ist immer wahr. Clang warnt standardmäßig davor (using the result of an assignment as a condition without parentheses), aber der Code wird trotzdem kompiliert und ausgeführt, also nimm Compiler-Warnungen so ernst wie Fehler.
Wie es weitergeht
Vergleiche diese Seite mit den Seiten zu Syntaxfehler und Laufzeitfehler, um zu sehen, wie jede Art gemeldet wird. Off-by-one-Fehler leben in Schleifen, also sind die Seite zu Iteration und die Python-Anleitung zu for-Schleifen gute nächste Schritte. Um falsche Ergebnisse in echten Übungen zu finden, probier den Python-Kurs.
Häufig gestellte Fragen
Was ist der Unterschied zwischen einem Syntaxfehler und einem Logikfehler?
Was ist ein Logikfehler in Python?
range(1, 5), wenn du 1 bis einschließlich 5 wolltest, a + b / 2, wenn du (a + b) / 2 wolltest, und if-Zweige, die in der falschen Reihenfolge geprüft werden. Python kann sie nicht erkennen, weil es nicht wissen kann, was du gemeint hast.