Vorrang von ++ und - Operatoren in Java

8

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 ~!

Operatoren

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.

    
Ziyao Wei 16.06.2011, 14:58
quelle

9 Antworten

12

Das Innere der println-Anweisung ist diese Operation (d ++) + (++ d)

  1. Es ist wie folgt, der Wert von d wird gelesen (d = 1)
  2. aktueller Wert von d (1) wird in die Additionsfunktion
  3. übernommen
  4. Wert von d wird inkrementiert (d = 2).

  5. Dann wird auf der rechten Seite der Wert von d gelesen (2)

  6. Der Wert von d wird erhöht (jetzt d = 3)
  7. Schließlich wird der Wert von d (3) in die Additionsfunktion

    übernommen

    also 1 + 3 ergibt die 4

edit: Entschuldigung für das Format, ich bin eher schlecht in der Verwendung der Liste haha ​​

    
Kevin Zhou 16.06.2011, 15:02
quelle
10

Der Schlüssel ist, was von der Operation zurückgegeben wird.

  • x ++ ändert den Wert von x, aber gibt das alte x zurück.
  • ++ x ändert den Wert von x und gibt den neuen Wert zurück.
%Vor%

Druckt 4

    
joeslice 16.06.2011 15:03
quelle
6

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:

  • linker Operand d++ . Dieser Teilausdruck besteht aus einem Postfix-Inkrement-Operator und einer Variablen, also hat er diese beiden Effekte:
    • Der Wert des Unterausdrucks ist 1
    • Die Variable wird aktualisiert: d = 2
  • rechter Operand ++d . Dieser Teilausdruck besteht aus einem Präfixinkrementoperator und einer Variablen, also hat er diese beiden Effekte:
    • Die Variable wird aktualisiert: d = 3
    • Der Wert des Unterausdrucks ist 3
  • operator + wird unter Verwendung der Werte der beiden Operanden ausgewertet.
    • Somit ist der Ausdruckswert 1 + 3 = 4.

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).

    
Paŭlo Ebermann 16.06.2011 15:08
quelle
2

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.

    
Oliver Charlesworth 16.06.2011 15:03
quelle
2

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.

    
dolphy 16.06.2011 15:07
quelle
0

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

    
antlersoft 16.06.2011 15:04
quelle
0

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 ()

übergeben

d ++ wird ausgeführt, also ist d jetzt 3.

    
Triton Man 16.06.2011 15:05
quelle
0

Zusätzlich zu den anderen Kommentaren schlage ich vor, dass Sie sich Sequenzpunkte ansehen, da einige dieser Dinge zu undefiniertem Verhalten führen können, obwohl ich denke, dass Ihr Fall für Java definiert ist.

Was macht x[i]=i++ + 1; ?

Ссылка

    
Jaydee 16.06.2011 15:06
quelle
0

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.

    
Siddesh Parmar 29.09.2013 15:19
quelle