Stefan Muenz: wie sage ich oder?!

Beitrag lesen

Hallo MudGuard,

Der Ausdruck ist nach wie vor immer wahr. Weil immer 5 der Zweige wahr sind. Und das reicht bei "oder" aus, um den Gesamtausdruck wahr zu machen. Hier muß "und" verwendet werden.

Sei geduldig! Logik ist genau das, was Programmierung schwer macht. Ich finde, das Beispiel hier ist typisch dafuer, wo die Fallstricke beim Programmieren lauern. Das Script laeuft syntaktisch fehlerfrei, tut aber nicht was es soll, einfach weil wie hier im Beispiel eine Bedingung logisch falsch formuliert ist.

Versuch vielleicht mal etwas deutlicher zu machen, was du meinst:
Bei der Bedingung
if (arr_date[1]!=1 || arr_date[1]!=2 || arr_date[1]!=3 || arr_date[1]!=4 || arr_date[1]!=11 || arr_date[1]!=12)
haben wir eine Oder-Verknuepfung von sechs Einzelausdruecken. Das Oder ist inklusiv und bedeutet: wenn eine der sechs Einzelausdruecke wahr ist, ist der gesamte Ausdruck wahr.
Angenommen, arr_date[1] hat den aktuellen Wert: 5.
Der Script-Interpreter gelangt in die if-Abfrage und faengt an, die Einzelausdruecke zu bewerten:
5!=1 ... das ist bereits wahr ("es ist wahr, dass 5 ungleich 1 ist").
Damit ist der Gesamtausdruck bereits ebenfalls wahr, und es wird gar nicht mehr weiter ausgewertet.
Angenommen, arr_date[1] hat den aktuellen Wert: 1.
Der Script-Interpreter gelangt in die if-Abfrage und faengt an, die Einzelausdruecke zu bewerten:
1!=1 ... das ist falsch ("es ist falsch, dass 1 ungleich 1 ist").
Also weiter mit dem naechsten Einzelausdruck:
1!=2 ... dies ist jedoch wahr ("es ist wahr, dass 1 ungleich 2 ist"), und damit braucht der Rest nicht weiter ausgewertet zu werden, da ja gilt, dass der Gesamtausdruck wahr ist, wenn einer der Einzelausdruecke wahr ist.
Es ist also so, dass die Auswertung bei allen Werten ausser 1 bereits beim ersten Einzelausdruck abbricht, da der Gesamtausdruck dann schon wahr ist. Nur beim Wert 1 wird ueberhaupt der zweite Einzelausdruck bewertet, und der ist dann aber auf jeden Fall wahr (ebenso wie alle nachfolgenden, die aber gar nicht mehr ausgewertet werden brauchen).

Der Grund fuer das unerwuenschte Verhalten der Auswertung sind wohl die Negativ-Vergleiche in den Einzelausdruecken. Wenn man die schon unbedingt beibehalten will (man koennte sie ja auch positiv formulieren), dann muss man die Einzelausdruecke durch logisches Und verknuepfen, um das erwuenschte Verhalten zu erreichen. Bei logischem Und gilt naemlich: der Gesamtausdruck ist nur wahr, wenn alle Einzelausdruecke wahr sind.

Also
if (arr_date[1]!=1 && arr_date[1]!=2 && arr_date[1]!=3 && arr_date[1]!=4 && arr_date[1]!=11 && arr_date[1]!=12)
Angenommen wieder, arr_date[1] hat den aktuellen Wert: 5.
Der Script-Interpreter gelangt in die if-Abfrage und faengt an, die Einzelausdruecke zu bewerten:
5!=1 ... dies ist wahr ("es ist wahr, dass 5 ungleich 1 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=2 ... dies ist wahr ("es ist wahr, dass 5 ungleich 2 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=3 ... dies ist wahr ("es ist wahr, dass 5 ungleich 3 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=4 ... dies ist wahr ("es ist wahr, dass 5 ungleich 4 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=11 ... dies ist wahr ("es ist wahr, dass 5 ungleich 11 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=12 ... dies ist wahr ("es ist wahr, dass 5 ungleich 12 ist").
Alle Einzelausdruecke sind also wahr, und somit ist der Gesamtausdruck wahr. von dem if abhaengiger Code wird also ausgefuehrt.
Jetzt mal mit Wert 1:
Der Script-Interpreter gelangt in die if-Abfrage und faengt an, die Einzelausdruecke zu bewerten:
1!=1 ... dies ist falsch ("es ist falsch, dass 1 ungleich 1 ist"). Damit ist der Gesamtausdruck bereits falsch, da ja jeder Einzelausdruck wahr sein muesste, damit der Gesamtausdruck wahr ist. Der Interpreter kann die Auswertung also beenden und - sofern vorhanden - den else-Zweig ausfuehren.

Das ist nun etwas arg ausfuehrlich geworden, aber manchmal hilft es einfach, systematisch ein paar Moeglichkeiten Schritt fuer Schritt durchzudenken. So kommt man Logikfehlern leichter auf die Schliche. Und gerade bei Sprachen wie JavaScript, fuer die es kaum Debugging-Tools mit Einzelschrittverfolgung und Variablen-Inspektion gibt, muss man so manches einfach mal systematisch im Kopf durchgehen.

viele Gruesse
  Stefan Muenz