Warum wird diese if-Anweisung mit einer Zuweisungs- und Gleichheitsprüfung als falsch bewertet?

105

Wie funktioniert eine Java if-Anweisung , wenn sie eine Zuweisung und eine Gleichheitsprüfung OR-d zusammen hat?

public static void test() {
    boolean test1 = true; 
    if (test1 = false || test1 == false) {
        System.out.println("TRUE");
    } else {
        System.out.println("FALSE");
    }       
}

Warum ist dieser Druck FALSCH?

RoHaN
quelle
1
Ausführen und überprüfen. Sehen Sie, welcher boolesche Wert gedruckt wird, wenn Sie false und true zuweisen. Lesen Sie dann weiter, wie OR funktioniert.
Pratik
2
Ich möchte sagen, dass dieser Code im Debug-Modus den Wert TRUE und im Running-Modus den Wert FALSE angibt ... Warum ist das so ??? ... (Ich setze meinen Haltepunkt auf if-Bedingung) ...
CoderNeji
test1=false, test1==falseIst false, false || falseist , false or falsedas ist false.
Jared Burrows
Ich weiß, dass Sie nicht um Rat gefragt haben, aber da die folgenden Antworten ein Vorrangproblem identifizieren, sind hier einige Methoden aufgeführt, die mir geholfen haben, Probleme zu vermeiden (wenn ich mich an diese halte): (1) Verwenden Sie immer Klammern, wenn nicht 100% bestimmte Vorrang oder zur besseren Lesbarkeit, um anderen Entwicklern zu helfen. Gehen Sie nicht davon aus, dass andere sich an Vorrangregeln für alle Operatoren erinnern (2), wenn Zuweisungen generell vermieden werden sollten, um Verwirrung zu vermeiden, außer bei sehr einfachen if-Bedingungen. Es gibt einige häufige Ausnahmen (insbesondere bei einfachen Überprüfungen auf E / A, Netzwerk usw.). Nur meine zwei Cent.
Rimsky
weiltest1 = true
Jono

Antworten:

189

Der Ausdruck wird nicht so analysiert, wie Sie denken. Es ist nicht

(test1=false) || (test1 == false)

in welchem ​​Fall wäre das Ergebnis gewesen true, aber

test1 = (false || test1 == false)

Der Wert des false || test1 == falseAusdrucks wird zuerst berechnet, und es ist false, weil test1eingestellt wird truegehen in die Berechnung.

Der Grund, warum es auf diese Weise analysiert wird, ist, dass die Priorität von der ||niedriger als die des ==Operators ist, aber höher als die Priorität des Zuweisungsoperators =.

dasblinkenlight
quelle
2
+1 @RohanFernando, bitte beachten Sie auch, dass, wenn Sie die Zuordnung wie folgt um Klammern setzen würden: ((test1 = false) || test1 == false)der Gesamtwert wäre true.
Arnon Zilca
1
Bitte schreiben Sie den Grund, warum das Parsen so geschieht ... Liegt es an der Prioritätsreihenfolge der Operatoren?
Kondu
3
@kondu Das ist eine faire Folgefrage, die ich bearbeitet habe, um einen Link zu einer Prioritätstabelle hinzuzufügen, die zeigt, dass ==oben ||, aber =unten ||.
Dasblinkenlight
Der letzte Absatz ist in dem Sinne irreführend, dass es ausreicht, um zu verstehen, warum die zweite Analyse anstelle der ersten gewählt wird, die (leicht zu merkende) Regel zu kennen, dass die Zuweisung jedem Nichtzuweisungsoperator (hier ||) eine niedrigere Priorität einräumt . Der relative Vorrang ||und ist ==nur relevant, dass das Parsen zu zeigen , ist nicht wie in test1 = ((false || test1) == false), das glaube ich nicht , dass jemand vernünftig (übrigens , dass die relativen Vorrang erwarten würde, oder allgemeiner , dass ||, &&haben eine niedrigere Priorität als die Beziehungen, ist auch leicht zu Denken Sie daran, da immer verwendet).
Marc van Leeuwen
1
@MarcvanLeeuwen Die relative Priorität von ||und ==vs ||und =erklärt, warum sich dies anders verhält als der (allgemeine) Fall von a == b || c == d.
Aaron Dufour
83

Dies ist im Grunde ein Vorrang. Sie gehen davon aus, dass Ihr Code entspricht:

if ((test1 = false) || (test1 == false))

... aber es ist nicht. Es ist eigentlich gleichbedeutend mit:

if (test1 = (false || test1 == false))

... was entspricht:

if (test1 = (false || false))

(weil test1ist mit truezu beginnen)

... was entspricht:

if (test1 = false)

die weisen den Wert falsezu test1, mit dem Ergebnis der Expression , während false.

Im Java-Tutorial zu Operatoren finden Sie eine nützliche Tabelle mit der Priorität von Operatoren.

Jon Skeet
quelle
2

Bitte schauen Sie sich die Rangfolge der Betreiber an

Der Ausdruck test1 = false || test1 == falsewird im folgenden Schritt ausgewertet.

SCHRITT: 1- test1 = false || test1 == false // Vorrang von ==ist am höchsten

SCHRITT: 2- test1 = false || false // Operator ||hat eine höhere Priorität

SCHRITT 3- test1 = false

SCHRITT 4- false

Da der boolesche Wert des Ausdrucks falsch wird, wird die Anweisung else ausgeführt.


quelle
-11

(test1 = false || test1 == false)gibt false zurück, da beide false sind. (test1 = false || test1 == true)das ist wahr, weil einer von ihnen wahr ist

Den
quelle
1
Komplett falsch. Warum würden Sie Tage nach Erhalt von zwei qualitativ hochwertigen Antworten, die beschreiben, was passiert, mit solchen falschen Informationen antworten?
14 MPI
5
Zwei Antworten von solch geringer Qualität verdienen keine individuell geschriebenen Kommentare. Sie erkennen, dass Ihre Antwort Unsinn ist, oder? Wenn nicht, lesen Sie die beiden Antworten von Jon und blinkenlight sorgfältig durch.
14 MPI