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
java
post-increment
pre-increment
Ankit Sachan
quelle
quelle
Antworten:
Hilft das?
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.quelle
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
und du machst
codaddict erklärt Ihr spezielles Snippet.
quelle
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 ++
quelle
ist
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.
ist
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.
quelle
++a
Inkremente,a
bevor es ausgewertet wird.a++
wertet es ausa
und erhöht es dann.Bezogen auf Ihren Ausdruck gegeben:
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.
quelle
Im obigen Beispiel
quelle
++ 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!
quelle
Vorausgesetzt, Sie meinten
Dies ergibt:
also ist i 6 + 7 + 7 = 20 und so wird 20 gedruckt.
also ist i 5 + 7 + 8 = 20 und so wird 20 erneut gedruckt.
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.
quelle
Wenn
a
es 5 ist,a++
gibt es eine 5 für den Ausdruck und erhöht esa
anschließend, während es++a
erhöht wird,a
bevor die Zahl an den Ausdruck übergeben wird (wasa
in diesem Fall 6 für den Ausdruck ergibt ).Also rechnen Sie
quelle
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:
quelle
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.
quelle
Pre-Inkrement und Post-Inkrement sind äquivalent, wenn sie nicht in einem Ausdruck enthalten sind
quelle
ist
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
. danna=7
wird bereitgestellt, um inkrement =>7 + 6 + 7 =20
und zu postena =8
.ist
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
Dahera=7
wird das Inkrement vor dem Inkrement gelöst, wenn .dann für das Inkrement nach dem Posten bereitgestellt wird =>7 + 7 + 6 =20
unda =8
.quelle
Ich glaube, Sie führen alle diese Anweisungen unterschiedlich aus.
Wenn Sie sie zusammen ausführen, ergibt sich => 38, 29
quelle