Ich lese aus dem offiziellen Tutorial von Java, dass Präfix und Postfix ++ - unterschiedliche Präzedenzfälle haben:
postfix: expr ++ expr -
unary: ++ expr --expr + expr -expr ~!
Nach dem Tutorial, sollte das nicht
d = 1; System.out.println(d++ + ++d);
Ausdruck 6 ( d++
macht d 2, ++d
macht 3) statt 4?
Ich weiß, dass die Erklärung von ++d
vorher ausgewertet wurde, aber wenn d++
eine höhere Priorität hat als ++d
, warum wird nicht d++
zuerst ausgewertet? Und was ist mehr, in welchem Fall d++
zeigt, dass es eine höhere Priorität hat?
BEARBEITEN:
Ich habe Folgendes versucht:
d = 1; System.out.println(++d * d++);
Es gibt 4. Es scheint, dass es 2 * 2 statt 1 * 3 sein sollte.
Das Innere der println-Anweisung ist diese Operation (d ++) + (++ d)
Wert von d wird inkrementiert (d = 2).
Dann wird auf der rechten Seite der Wert von d gelesen (2)
Schließlich wird der Wert von d (3) in die Additionsfunktion
übernommenalso 1 + 3 ergibt die 4
edit: Entschuldigung für das Format, ich bin eher schlecht in der Verwendung der Liste haha
Unterschiedliche Priorität bedeutet nicht, dass zuerst ausgewertet wird .
Es bedeutet die Ausdrücke werden auf diese Weise gruppiert .
In diesem Fall wird d++ + ++d
zu (d++) + (++d)
gruppiert und dieser binäre Ausdruck wird in dieser Reihenfolge ausgewertet:
d++
. Dieser Teilausdruck besteht aus einem Postfix-Inkrement-Operator und einer Variablen, also hat er diese beiden Effekte:
1
d = 2
++d
. Dieser Teilausdruck besteht aus einem Präfixinkrementoperator und einer Variablen, also hat er diese beiden Effekte:
d = 3
3
+
wird unter Verwendung der Werte der beiden Operanden ausgewertet.
Die unterschiedliche Priorität zwischen den Präfix- und Postfix-Formularen von ++
würde nur in ++d++
zu sehen sein, was als ++(d++)
interpretiert wird - und das hat keine Bedeutung ( (++d)++
hat auch keinen). da ++
nur für Variablen funktioniert, nicht für Werte (und das Ergebnis ist ein Wert).
Hier geht es nicht um den Vorrang, sondern um die Reihenfolge der Bewertungen. d++
wird als 1
ausgewertet, aber dann wird d
inkrementiert. ++d
erhöht d
und berechnet dann 3.
Siehe Warum wird die Vorrangstellung dieses Java-Operators hier ignoriert? .
Es läuft darauf hinaus, dass der Postfix-Operator zuerst ausgewertet wird, aber den ursprünglichen Wert der Variablen wie vorgesehen zurückgibt. Also, für die Zwecke Ihrer Operation:
%Vor%Die Verwirrung ist nicht in der Rangfolge der zu bewertenden Token, das ist richtig. Das eigentliche Problem liegt im Verständnis des funktionalen Unterschieds zwischen den Postfix- und Präfixoperatoren.
d hat den Wert 1
d ++ wird ausgewertet; Der Wert ist 1 und d ist jetzt 2 (post ++ gibt den Wert vor dem Inkrement zurück)
++ d wird ausgewertet; es ist der Wert 3 und d ist jetzt 3 (++ Pre-Return-Wert nach Inkrement)
1 + 3 = 4
System.out.println (d ++ + ++ d);
So geht's:
++ d wird ausgeführt, also ist d jetzt 2.
d + d wird ausgeführt, was gleich 4 ist.
Der Wert 4 wird an System.out.println ()
übergebend ++ wird ausgeführt, also ist d jetzt 3.
Ich ging alle Erklärungen von oben durch. Nach dem Verständnis sollte der folgende Code 11.0 ergeben, dann gibt es 10.0 Doppel x = 4,5; x = x + ++ x; // x erhält den Wert 10.0.
Tags und Links java increment postfix-operator prefix operator-precedence