Wie funktionieren die Operatoren Post-Inkrement (i ++) und Pre-Inkrement (++ i) in Java?

99

Können Sie mir die Ausgabe dieses Java-Codes erklären?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

Die Ausgabe beträgt in beiden Fällen 20

Ankit Sachan
quelle
9
Vermeiden Sie immer mehrdeutige Aussagen :)
Prasoon Saurav
9
@Prasoon Saurav Im Gegensatz zu C und C ++ haben Java und C # eine genau definierte Reihenfolge der Auswertung, sodass diese Aussagen nicht mehrdeutig sind.
Pete Kirkham
12
Ich weiß das, aber dennoch werden diese Aussagen nicht für praktische Zwecke verwendet (können nicht verwendet werden), daher muss man sie vermeiden.
Prasoon Saurav
4
@PeteKirkham Es ist mehr als sechs Jahre später, aber ich möchte immer noch darauf hinweisen, dass "mehrdeutig" in dieser Situation mehrdeutig ist - es könnte bedeuten, dass der Compiler nicht weiß, was er setzen soll, oder es könnte bedeuten, dass der Programmierer hat keine Ahnung was es bedeutet ".
Fund Monica Klage

Antworten:

150

Hilft das?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

Der Hauptpunkt ist, dass ++ader Wert erhöht und sofort zurückgegeben wird.

a++ erhöht auch den Wert (im Hintergrund), gibt jedoch den unveränderten Wert der Variablen zurück - wie es aussieht, wird sie später ausgeführt.

kgiannakakis
quelle
5
Bist du sicher, dass im zweiten eine == 9 ist?
Pete Kirkham
1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) Wird ein ++ zuerst ausgeführt, da das Nachinkrement die höchste Priorität hat?
rsirs
2
kompliziertes Beispiel für etwas, das leicht zu erklären ist.
Oznus
Ist diese Antwort für c # und c ++ gleich?
Workoverflow
Warum sind a, b und c hier gleich 2? int a = 1; int b = a++; int c = ++b;Ich habe erwartet, dass b 1 ist, da es sich um ein Post-Inkrement handelt.
Dennis
201

++aerhöht und verwendet dann die Variable.
a++verwendet die Variable und erhöht sie dann.

Wenn Sie haben

a = 1;

und du machst

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

codaddict erklärt Ihr spezielles Snippet.

Lombo
quelle
62

In beiden Fällen wird zuerst der Wert berechnet, aber nach dem Inkrementieren wird der alte Wert beibehalten und nach der Berechnung zurückgegeben

++ a

  1. a = a + 1;
  2. return a;

a ++

  1. temp = a;
  2. a = a + 1;
  3. Rücklauftemperatur;
Tigran Babajanyan
quelle
8
Klarste Antwort
Kartik Chugh
2
Dies war derjenige, der mich klar verstehen ließ. Danke.
Rematnarab
22
i = ++a + ++a + a++;

ist

i = 6 + 7 + 7

Arbeiten : Erhöhen Sie a auf 6 (aktueller Wert 6) + erhöhen Sie a auf 7 (aktueller Wert 7). Die Summe ist 13, addiere sie jetzt zum aktuellen Wert von a (= 7) und erhöhe dann a zu 8. Die Summe ist 20 und der Wert von a nach Abschluss der Zuweisung ist 8.

i = a++ + ++a + ++a;

ist

i = 5 + 7 + 8

Arbeiten : Der Startwert von a ist 5. Verwenden Sie ihn in der Addition und erhöhen Sie ihn dann auf 6 (aktueller Wert 6). Erhöhen Sie a vom aktuellen Wert 6 auf 7, um einen anderen Operanden von + zu erhalten. Die Summe ist 12 und der aktuelle Wert von a ist 7. Erhöhen Sie als nächstes a von 7 auf 8 (aktueller Wert = 8) und addieren Sie ihn zur vorherigen Summe 12, um 20 zu erhalten.

Codaddict
quelle
Diese Aussagen funktionieren von rechts nach links oder von links nach rechts?
Abhijeet
10

++aInkremente, abevor es ausgewertet wird. a++wertet es aus aund erhöht es dann.

Bezogen auf Ihren Ausdruck gegeben:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

Die oben verwendeten Klammern werden implizit von Java verwendet. Wenn Sie die Begriffe so betrachten, können Sie leicht erkennen, dass beide gleich wie kommutativ sind.

Aurril
quelle
1
@ KlasLindbäck kommutativ bedeutet, dass Sie beide Ausdrücke austauschen können und trotzdem das gleiche Ergebnis erhalten. Also a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 am Ende).
Aurril
8

Im obigen Beispiel

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29
Vinod
quelle
4

++ a ist ein Präfix-Inkrement-Operator:

  • Das Ergebnis wird zuerst berechnet und gespeichert.
  • dann wird die Variable verwendet.

a ++ ist ein Postfix-Inkrement-Operator:

  • Die Variable wird zuerst verwendet.
  • dann wird das Ergebnis berechnet und gespeichert.

Sobald Sie sich an die Regeln erinnern, können Sie mit EZ alles berechnen!

Xinyi Liu
quelle
4

Vorausgesetzt, Sie meinten

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

Dies ergibt:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

also ist i 6 + 7 + 7 = 20 und so wird 20 gedruckt.

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

also ist i 5 + 7 + 8 = 20 und so wird 20 erneut gedruckt.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

und nachdem die gesamte rechte Seite ausgewertet wurde (einschließlich der Einstellung von a auf 8), DANN wird a auf 6 + 7 + 7 = 20 gesetzt und so wird 20 ein letztes Mal gedruckt.

user93199
quelle
3

Wenn aes 5 ist, a++gibt es eine 5 für den Ausdruck und erhöht es aanschließend, während es ++aerhöht wird, abevor die Zahl an den Ausdruck übergeben wird (was ain diesem Fall 6 für den Ausdruck ergibt ).

Also rechnen Sie

i = 6 + 7 + 7
i = 5 + 7 + 8
Thorbjørn Ravn Andersen
quelle
3

Ich glaube jedoch, wenn Sie alle Ihre Anweisungen kombinieren und in Java 8.1 ausführen, erhalten Sie eine andere Antwort, zumindest sagt dies meine Erfahrung.

Der Code funktioniert folgendermaßen:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29
Rishabh Vashishtha
quelle
3

Pre-Inkrement bedeutet, dass die Variable inkrementiert wird, bevor sie im Ausdruck ausgewertet wird. Nachinkrementierung bedeutet, dass die Variable inkrementiert wird, nachdem sie für die Verwendung im Ausdruck ausgewertet wurde.

Schauen Sie daher genau hin und Sie werden sehen, dass alle drei Zuordnungen arithmetisch äquivalent sind.

Oke Uwechue
quelle
2

Pre-Inkrement und Post-Inkrement sind äquivalent, wenn sie nicht in einem Ausdruck enthalten sind

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10
Java Main
quelle
0
a=5; i=++a + ++a + a++;

ist

i = 7 + 6 + 7

Arbeiten: Pre / Inkrement hat "von rechts nach links" Assoziativität, und Pre hat Vorrang vor Post, daher wird Pre-Inkrement zunächst als gelöst (++a + ++a) => 7 + 6. dann a=7wird bereitgestellt, um inkrement => 7 + 6 + 7 =20und zu posten a =8.

a=5; i=a++ + ++a + ++a;

ist

i=7 + 7 + 6

Arbeiten: Das Inkrement vor / nach dem Inkrement hat die Assoziativität "von rechts nach links", und das Inkrement hat Vorrang vor dem Post-Inkrement. (++a + ++a) => 7 + 6Daher a=7wird das Inkrement vor dem Inkrement gelöst, wenn .dann für das Inkrement nach dem Posten bereitgestellt wird => 7 + 7 + 6 =20und a =8.

Vineet Sahu
quelle
0

Ich glaube, Sie führen alle diese Anweisungen unterschiedlich aus.
Wenn Sie sie zusammen ausführen, ergibt sich => 38, 29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
Randhawa
quelle