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


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.


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.


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;

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.


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.


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

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!


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.


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

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

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.


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

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.


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.