[Java] While Schleide mit 2. Bedingungen bricht zu früh ab.

MasterOfWar

Lt. Commander
Registriert
Jan. 2009
Beiträge
1.397
Abend,
ich habe eine while Schleife
PHP:
do{
......
}while((a==true)&&(b==true))

Die bricht ja ab, sobald sich eine der Bedingungen ändert, als bsp. a==false ist.
Gibt es eine Möglichkeit, wie ich ohne zusätzliche if Bedingung o.ä. dafür sorgen kann, dass die Schleife erst abbricht, wenn sich beide ändern ?
 
Code:
do{
......
}while((a!=false)||(b!=false))

oder

Code:
do{
......
}while((a==true)||(b==true))
 
Zuletzt bearbeitet:
((a==true)&&(b==true)) bedeutet: sobald a false ist, bricht sie ab, egal ob b überhaupt iwann false wird oder nicht. Dafür ist der &&-Operator da.
Der Code vom grünel ist Quark.

((a==true)&(b==true)) bedeutet: sobald a false UND b false ist, bricht sie ab.

Ersteres ist für "performance-optimierten" code gedacht.

In deinem Fall brauchst du also die 2. Variante.
 
omniscient schrieb:
Der Code vom grünel ist Quark.

Warum? Er will, dass die Schleife abbricht, sobald beide Variablen auf false stehen. Mein Code tut genau das.

- hier stand Mist - :)
 
Zuletzt bearbeitet:
omniscient schrieb:
Der Code vom grünel ist Quark.

Wieso? Der OP will, daß die Schleife abbricht, wenn keine der beiden Bedingungen mehr erfüllt ist. Also sobald der Ausdruck ( ! a && ! b ) true ist, soll abgebrochen werden. Das heißt also, also die Schleife soll weiter laufen, so lange die boolsche Umkehrung dieses Ausdrucks true bleibt. Die boolsche Umkehrung von ( ! a && ! b ) ist ( a || b ).
 
grünel schrieb:
Edit: Hast Recht. In Java müsste es "|" sein, nicht "||". Hab mich in der Sprache vertan, sorry (programmiere selbst nicht in Java). Post ist editiert :-)

Tja, leider war deine erste Variante aber richtig. Der OP will keine Bits verodern sondern zwei boolsche Ausdrücke. Für ersteres wäre | die richtige Wahl, für letzteres ||.
 
antred schrieb:
Tja, leider war deine erste Variante aber richtig. Der OP will keine Bits verodern sondern zwei boolsche Ausdrücke. Für ersteres wäre | die richtige Wahl, für letzteres ||.

Alles klar, danke. War n bisschen verwirrt durch den Post von omniscient.

Ich sollte mich zu so später Stunde einfach von derartigen Threads fernhalten :-)
 
Zuletzt bearbeitet:
omniscient schrieb:
((a==true)&(b==true)) bedeutet: sobald a false UND b false ist, bricht sie ab.

Spielen wir das doch mal durch.

Code:
    do{
    ......
    }while((a==true)&(b==true))

Nehmen wir an, a = true und b = false.

(a==true) -> true
(b==true) -> false

( true & false ) entspricht der bitweisen Verundung ( 1 & 0 ). Das Ergebnis dieser Verundung ist 0, was in einem boolschen Kontext wieder false entspricht.

Damit bricht diese Schleife schon ab, wenn a oder b false sind, nicht erst dann, wenn BEIDE false sind.
 
Die Beschreibung von && und & ist eben nicht Unsinn, aber für den Threadersteller war meine Lösung falsch.

Les dich mal einfach bisschen ein, wie in java &&/& interpretiert wird. Du wirst feststellen, dass meine Beschreibung nicht verkehrt ist.

Sollte natürlich "spiegelverkehrt" sein, wie grünel richtig sagte.
Mein Fehler.
 
omniscient schrieb:
((a==true)&&(b==true)) bedeutet: sobald a false ist, bricht sie ab, egal ob b überhaupt iwann false wird oder nicht. Dafür ist der &&-Operator da.

das würde bedeuten, dass die auswertung gar nicht von b anhängt, was nicht der fall ist.
die lazy evaluation heißt vielmehr: abgebrochen wird die schleife wie bei &, nur dass b nicht mehr angeschaut wird, falls a schon false ist.
ist a true und b false, wird sie aber sehr wohl abgebrochen.
 
Zurück
Oben