Logikfehler do-while Schleife

Zitrus

Bekanntes Mitglied
Hallo liebe Java-Freunde,

Ich habe ein kleines Logikproblem.
Java:
String richtung;

do {
            System.out.println("Wähle deine gewünschte Richtung");
            System.out.println("Du kannst zwischen oben,unten,rechts und links wählen!");
            richtung = new Scanner(System.in).nextLine();
        } while( !richtung.equalsIgnoreCase("oben") & !richtung.equalsIgnoreCase("unten") & 
        !richtung.equalsIgnoreCase("rechts") & !richtung.equalsIgnoreCase("links"));

Nun zu meiner Frage: Wieso kann man diesen Teil des Codes
Java:
while( !richtung.equalsIgnoreCase("oben") & !richtung.equalsIgnoreCase("unten") & 
        !richtung.equalsIgnoreCase("rechts") & !richtung.equalsIgnoreCase("links"));

Nicht mit | (Oder) schreiben? Ich meine in Worten würde es ja so aussehen:

Mit Und:

Wiederhole solange wie richtung ungleich "oben" UND richtung ungleich "unten" UND richtung ungleich "rechts" UND richtung ungleich "links"

Mit Oder:

Wiederhole solange wie richtung ungleich "oben" ODER richtung ungleich "unten" ODER richtung ungleich "rechts" ODER richtung ungleich "links"

Liest sich in meinen Augen vom Sinn her gleich. Ich glaube ich bin etwas neben der Spur 😀

Hoffe ihr könnt mir weiterhelfen,
Mfg,Zitrus
 
Du benutzt den Bitverknüpfungsoperator &. Du meinst aber den Logikoperator &&. Du solltest den Zweiten nehmen. Noch ist es dasselbe aber beim Ersten könnte es irgendwann knallen.

Beim UND müssen alle Ausdrücke true ergeben. Also muss richtung ungleich "oben", "unten", "links" und "rechts" sein, damit der Rumpf durchlaufen wird.
Beim ODER muss nur ein einziger Ausdruck true ergeben. Also muss richtung entweder ungleich "oben", oder "unten", oder "links", oder "rechts" sein.
 
Hi,

also meines Wissens muss man Bedingungen so verUNDen
Java:
while(true && true){
...

und so verODERn
Java:
while(true || true){
...

vielleicht liegt es daran?
 
Guten Abend.

bartzer hat vollkommen Recht, du versuchst & und | zu benutzen, obwohl du eigentlich && und || meinst.

Mit freundlichen Grüßen
Xelsarion
 
Also allgemein gesagt, kann man die Bit-Operatoren(&, |) dazu verwenden boolsche Ausdrücke miteinander zu verknüpfen. Es sind nicht nur die Bit-Operatoren sondern werden auch zur Eager(Greedy)-Evaluation verwendet. Das bedeutet, dass jeder Ausdruck in einen Therm ausgewertet wird und zum Schluß dann die boolschen Operatoren angewendet werden.

Bei den anderen Operatoren, die oben genannt wurden, die Short-circuit Operatoren(&&, ||) werden die einzelnen Ausdrücke nur bei Bedarf ausgewertet und gehören zu den Lazy-Evalution Strategien. Das heißt wenn ein logisches ODER verwendet wird, werden dann so lange Ausdrücke ausgewertet, bis ein Ausdruck WAHR zurückliefert, somit kann die restliche Auswertung übersprungen werden und der ganze Therm ist wahr.

Man kann das Gesetz von deMorgan Anwenden, um deinen Ausdruck mit ODER statt UND zu verknüpfen.

Bsp.:
!(a AND b) <=> !a OR !b
 

Zurück
Oben