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
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
Antworten:
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 ++a
der 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.
int a = 1; int b = a++; int c = ++b;
Ich habe erwartet, dass b 1 ist, da es sich um ein Post-Inkrement handelt.
++a
erhö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.
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
a ++
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.
++a
Inkremente, a
bevor es ausgewertet wird.
a++
wertet es aus a
und 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.
++ a ist ein Präfix-Inkrement-Operator:
a ++ ist ein Postfix-Inkrement-Operator:
Sobald Sie sich an die Regeln erinnern, können Sie mit EZ alles berechnen!
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.
Wenn a
es 5 ist, a++
gibt es eine 5 für den Ausdruck und erhöht es a
anschließend, während es ++a
erhöht wird, a
bevor die Zahl an den Ausdruck übergeben wird (was a
in diesem Fall 6 für den Ausdruck ergibt ).
Also rechnen Sie
i = 6 + 7 + 7
i = 5 + 7 + 8
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
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.
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=7
wird bereitgestellt, um inkrement => 7 + 6 + 7 =20
und 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 + 6
Daher a=7
wird das Inkrement vor dem Inkrement gelöst, wenn .dann für das Inkrement nach dem Posten bereitgestellt wird => 7 + 7 + 6 =20
und a =8
.
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)