2015-04-16 7 views
101

Wie funktioniert ein Java if-Anweisung arbeiten, wenn es eine Zuordnung und eine Gleichheitsprüfung OR -d zusammen hat ??Warum wird diese if-Anweisung mit einer Zuweisung und einer Gleichheitsprüfung als falsch ausgewertet?

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

Warum ist dieses Drucken FALSCH?

+12

Warum druckt FALSE – RoHaN

+1

Starten und überprüfen. Sehen Sie, welcher boolesche Wert gedruckt wird, wenn Sie false zuweisen und true zuweisen. Dann lesen Sie weiter, wie OR funktioniert. – Pratik

+2

Ich möchte sagen, dass dieser Code im Debug-Modus TRUE-Wert gibt und im Running-Modus gibt FALSE Wert ... Warum ist es so ??? ... (Ich setze meinen Haltepunkt bei Bedingung) ... – CoderNeji

Antwort

184

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

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

in diesem Fall wäre das Ergebnis true gewesen, aber

test1 = (false || test1 == false) 

Der Wert der false || test1 == false Ausdruck wird zuerst berechnet, und es ist false, weil test1 zu true setzen wird in die Berechnung.

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

+2

+1 @RohanFernando, bitte beachten Sie auch, dass wenn Sie Klammern um die Zuweisung wie folgt hinzufügen: '((test1 = false) || test1 == false)' der Gesamtwert wäre 'true'. –

+1

Bitte schreibe den Grund warum Parsing so passiert ... 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 Rangfolge-Tabelle hinzuzufügen, die zeigt, dass '==' über '|| 'steht, aber' = 'unterhalb von' || 'steht. – dasblinkenlight

81

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

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

... aber es ist nicht. Es ist eigentlich äquivalent zu:

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

... was gleichbedeutend ist mit:

if (test1 = (false || false)) 

(weil test1 ist true mit zu beginnen)

... was gleichbedeutend ist mit:

if (test1 = false) 

, die den Wert false 01 zuweist, wobei das Ergebnis der Ausdruck false ist.

Eine nützliche Tabelle mit Operatorenprioritäten finden Sie unter Java tutorial on operators.

-10

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

+1

Völlig falsch. Warum würden Sie mit solchen falschen Informationen antworten, nachdem die Frage zwei qualitativ hochwertige Antworten erhalten hat, die beschreiben, was passiert? – l4mpi

+5

Zwei Antworten von solch geringer Qualität verdienen keine individuell geschriebenen Kommentare. Du erkennst, dass deine Antwort Unsinn ist, oder?Wenn nicht, lesen Sie sorgfältig die beiden Antworten von Jon und blinkenlight. – l4mpi

2

please have a look over precedence of operators

Expression test1 = false || test1 == false wird in folgendem Schritt bewerten.

STEP: 1-test1 = false || test1 == false // Vorrang von == ist höchste

STEP: 2-test1 = false || false // Operator || haben höhere Priorität

STEP: 3-test1 = false

SCHRITT: 4-false

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

Verwandte Themen