2017-12-11 5 views
2

Der folgende Code in Java:Java Post Schritt und vor Schritt

int a = 0, b = 0, c = 0; 
boolean d = (a++ > 0 && b-- < 0) || --c < 0; 

Ergebnisse in den Werten:

a = 1, b = 0, c = -1 and d = true 

Ich verstehe nicht, warum a = 1 ist, weil es ein Beitrag ist Inkrementieren und sollte genauso reagieren wie der Wert b. Auch wenn ich die b-- zu --b ändere, hat es immer noch keine Auswirkung auf den Wert von b.

Was ist der beste Weg, diese Logik zu verstehen?

+0

Mögliches Duplikat von [Wenn Java eine Konjunktion auswertet ( && ), wird exp2 ausgewertet, wenn exp1 falsch ist?] (Https://stackoverflow.com/questions/9445145/when-java -evaluates-a-conjunction-boolean-exp1-boolesche-exp2-does-it-ev) – Joe

+0

im Allgemeinen: solche Code sollte in der realen Programmierung vermieden werden, es ist überholt. Ich verstehe, hier ist Bildungskontext –

+1

Siehe auch [Java-Kurzschluss-Betreiber] (https://Stackoverflow.com/a/8759917/8097737) – devpuh

Antwort

13

a++ > 0 gibt false zurück, da a++ den vorherigen Wert a (0) zurückgibt.

Daher wird b-- < 0 überhaupt nicht ausgewertet, da && ein Kurzschließer ist. Der rechte Operand wird nur ausgewertet, wenn der linke Operand true ist.

--c < 0 wird ausgewertet, da der erste Operand des || Operators false ist, daher muss der zweite Operand ausgewertet werden.

Nachdem d ausgewertet wurde, ist der Wert a1, da a inkrementiert wurde. b bleibt 0, da b-- nicht ausgeführt wurde. c ist -1 seit --c wurde ausgeführt. Und d ist true seit --c < 0 ist true.

+0

Danke für Ihre Zeit, das half mir, das Konzept zu verstehen! –

0

a++ zum Zeitpunkt des Vergleichs ist nicht >0, also b Teil wird nicht ausgewertet, und nicht inkrementiert.

Zweiter Teil von && und || Ausdrücke werden nicht ausgewertet, wenn Ergebnis nicht geändert werden kann. Für && zuerst false bestimmt Ergebnis false.

analogisch, erste true bestimmt Ergebnis || (aber nicht hier)

+0

Zum Zeitpunkt des Vergleichens ist "a" ** ** 1, aber der Vergleich bezieht sich auf "a ++", was den ** vorherigen ** Wert von "a" (vor dem Inkrement), nicht den ** aktuellen zurückgibt ** Wert (nach Inkrement). –

+0

natürlich. Ich aktualisiere Antwort –

0

Nachdem der Ausdruck läuft dann ein in der Tat 1 als Beitrag Inkrementoperator sein wird hat dann ausgeführt.

Während der Auswertung des Ausdrucks a ist 0 so weit wie der Ausdruck betrifft (aber a ist jetzt 1 für anderen Code), so wird der erste Teil des logischen ODER, Ihre logische UND, als falsch und die ausgewertet b post dekrement wird nicht ausgewertet.

Der zweite Teil der logischen oder dann läuft, und die Vor-Dekrementierung wird ausgeführt, um c auf -1 zu reduzieren, was dann bewirkt, dass der Vergleich als wahr ausgewertet wird, daher ist d wahr.

Erweitern Sie die verschiedenen Klauseln, um Variablen zu trennen, und führen Sie einen Debugger durch, um eine interaktive Erklärung der Vorgänge zu erhalten.

0

Wenn Sie ein ++ ODER b-- schreiben, übergibt es den Wert "a" und "b" hält derzeit und ändert dann die Variablen.

Also Ihr Ausdruck ist einfach,

boolean d = (0 > 0 && 0 < 0) || -1 < 0; 

Jetzt, während die Bewertung (0> 0 & 0) -> erster Ausdruck false zurück, und Sie haben Kurzschluss AND-Operator verwendet. Bedeutung nicht die rechte Seite bewerten, wenn es nicht notwendig ist. Als LHS & & gibt false zurück, b-- wird nicht ausgewertet.

Und wir haben 'd' ist wahr. Denken Sie daran,

Post-increment innerhalb von Ausdrücken -> zuweisen aktuellen Wert zuerst, später ändern.

In den Ausdrücken vorkrementieren -> zuerst ändern, später den aktualisierten Wert zuweisen.

Siehe diesen Link für ein besseres Verständnis Kurzschluss Betreiber: Short-Circuit Explanation

+0

Dies erklärt nicht die [Kurzschlussoperatoren '&&' und '||'] (https://Stackoverflow.com/a/8759917/8097737), die dieses Verhalten verursachen. – devpuh

+0

@devpuh hat die Antwort bearbeitet. Erklärt das Verhalten jetzt. –

-2

Dieser Code ausführen Bitte ..

int a = 0, b = 0, c = 0; 
System.out.println("b = " + --b); 
b=0; 
System.out.println("b = " + b--); 
System.out.println("a = " + a++); 
a=0; 
System.out.println("a = " + ++a); 
System.out.println("c = " + c--); 
c=0; 
System.out.println("c = " + --c); 
a=b=c=0; 
boolean d = (a++ > 0 && --b < 0) || --c < 0; 

System.out.println("d = " + d); 

Ich glaube, Sie volle Logik verstehen.

+1

Wenn eine Person eine Frage stellt ist, dass sie nicht versteht, ist es besser, eine detaillierte Antwort für diese Antwort zu anderen nützlich sein (es ist das Ziel von StackOverflow ...) – F0XS

+0

Dies erklärt nicht die [Kurzschluss Operatoren '&&' und '||' (https://Stackoverflow.com/a/8759917/8097737), die dieses Verhalten verursachen. – devpuh

0

a ++ bedeutet effektiv a = a + 1 So wird der vorhandene Wert von a (= 0) zur Auswertung des Ausdrucks verwendet, und später wird der Wert von a inkrementiert. Also, a wird 1.

In Bezug auf warum b = 0 und warum - b hat die gleiche Wirkung wie b--, ist der Wert von b unverändert wegen & &. Da a ++> 0 nicht erfüllt ist, wird der nächste Ausdruck b - < 0 nicht ausgewertet und der Wert von b bleibt 0. & & stoppt die Auswertung, sobald der Ausdruck zu false ausgewertet wird, während || stoppt die Auswertung, sobald die Anweisung zu false ausgewertet wird.

Verwandte Themen