2016-08-21 6 views
0
x=10; 
y = --x + x++; 
System.out.println(y); 
// prints 18  

Gemäß dem Link https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html hat postfix inkrement (x ++) eine höhere Priorität als Präfix inkrement/dekrement (--x).Vorrang für Java-Operatoren y = --x + x ++;

Daher x++ (Wert 10) sollte vor --x (Wert 11-1 = 10) ausgeführt werden; so y=20. Aber wie wird "y" 18?

+2

Siehe auch http://stackoverflow.com/questions/2371118/how-do-the-post -increment-i-und-pre-increment-i-operators-work-in-java – Tunaki

+1

Ich weiß nicht, was sie mit höherer Priorität in diesem Tutorial meinen; Es ist hier sicherlich nicht relevant. Die Operanden von '+' werden von links nach rechts ausgewertet, also wird '--x' vor' x ++ 'ausgewertet. @ Tunaki Link ist sehr nützlich für weitere Details. –

+0

Was mich am Anfang interessierte, war der Punkt, an dem 'a ++' vor '++ a' steht, da' ++ a ++ 'falsch ist, da beide' ++ 'einen Wert zurückliefern, aber sie erwarten eine Variable Ursache Ausnahme, wenn es als '(++ a) ++ 'oder' ++ (a ++) 'kompiliert wird. Aber wenn ich mich nicht irre, ist es im Fall von a +++ b praktisch, zu bestimmen, dass es "(a ++) + b" und nicht "a + (++ b)" ist. – Pshemo

Antwort

3

Wie es bei this link

Assoziativität und Vorrang bestimmen, in welcher Reihenfolge Java gilt Betreiber Teilausdrücke erklärt, aber sie bestimmen nicht, in welcher Reihenfolge die Teilausdrücke ausgewertet werden. In Java werden Teilausdrücke von links nach rechts ausgewertet (wenn eine Auswahlmöglichkeit besteht). So werden zum Beispiel in dem Ausdruck A() + B() * C(D(), E()) die Teilausdrücke in der Reihenfolge A(), B(), D(), E() und C() ausgewertet. Obwohl C() links neben D() und E() erscheint, benötigen wir die Ergebnisse von D() und E(), um C() auszuwerten. Es wird als schlechter Stil angesehen, Code zu schreiben, der auf diesem Verhalten beruht (und verschiedene Programmiersprachen können andere Regeln verwenden).

Dies erklärt, warum

--x 

ausgeführt und ausgewertet wird, bevor als

x++ 

, da es eine Summe von zwei Teilausdrücke und der ganze Ausdruck ist von links nach rechts ausgewertet. So wird der erste vor dem x++ ausgeführt (ja, der Postfix ++ hat im Allgemeinen mehr Vorrang, aber hier wird der Unterausdruck, der ihn enthält, nach dem ersten ausgewertet).

So, 18 korrekt ist, wie Sie zweimal 9-x summieren, zu klären, wie unten

x=10; 
y = --x + x++; 
// y = (10-1) /* now x==9 */ + (9); /* after this x == 10 */ 
// y = (9) + (9); /* and now x == 10 */ 
// y == 18 and x == 10 
+0

@Pshemo, ich aktualisierte meine Antwort – ddb

+0

@ maanick90, aktualisierte ich meine Antwort – ddb