Der Code sieht so aus:
public class testplusplus {public static void main (String [] args) {int k = addAfterReturn (10); System.out.println (k); // Ausgabe 10 int k1 = addBererTurn (10); System.out.println (K1); // Ausgabe 11} public static int addBeforerEnturn (int i) {return ++ i; } public static int addAfterReturn (int i) {return i ++; }}Aus der Bytecode -Ebene,
Der Bytecode von AddAfterReturn lautet wie folgt:
0: iload_01: iinc 0, 14: Ireturn
Es ist einfach, iLoad_0 bedeutet, den Wert des Elements in der lokalen variablen Tabelle auf 0 in die Oberseite des Stapels zu bringen. Daher ist der Wert von I übergeben, der in die Oberseite des Stapels gelegt wird, und IINC 0,1 bedeutet, die lokale variable Tabelle zu platzieren
Elemente mit Index 0 werden zu 1 hinzugefügt, und schließlich stellt Ireturn den INT -Wert oben im Stapel in den Stapelrahmen des Anrufers. (Die Stapel hier sind Operand Stacks)
Daher beeinflussen IINC 0 und 1 den zurückgegebenen Wert nicht wirklich, sodass die Rendite immer noch 10 beträgt.
In ähnlicher Weise ist AddBererTurn Bytecode wie folgt:
0: iinc 0, 13: iload_04: Ireturn
Ich werde es allen für seine eigene Analyse überlassen. Tatsächlich ist es offensichtlich, dass dies zuerst inkrementiert und dann in den Stapel eingeht. Der zurückgegebene Wert wird also tatsächlich inkrementiert.
Lassen Sie uns nun eine Interviewfrage machen, die ich selbst korrigiert habe.
public class testplusplus2 {static {x = 5; int y = 10; } static int x, y; public static void main (String args []) {x--; myMethod (); System.out.println (x+y+++ x); } public static void myMethod () {y = x +++++ x; }}Kennen Sie die Antwort? Führen Sie es aus, die richtige Antwort ist 23.
Wenn Sie die oben genannten wirklich verstehen, ist diese Frage auch sehr einfach. Erstens kennen Sie die Werte von x und y, bevor Sie Main ausführen. Dies beinhaltet den Klassenbeladungsmechanismus. Die Vorbereitungsstufe der Klassenbelastung weist dem Nullwert dieses Typs die statische Variable zu. Wenn int int ist, entspricht es 0. In der Initialisierungsstufe der Klasse werden die statischen Blöcke und statischen Verhaltensweisen der variablen Zuordnung in der Klasse gemäß der Code -Reihenfolge erfasst, um die Methode zu generieren. Daher in diesem Test x = 5, y = 0;
Weiter zu analysieren, x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
X ++ fügt 1 vor der Ausführung des nachfolgenden Additionsvorgangs nicht 1 hinzu, genau wie die Rückkehr i ++ erst nach der Rückkehr (Sie können die Rückkehr als ober -Operation der Iload -Stapel verstehen, also nicht die IRTRUN -Anweisung), also ist der erste Add 4, aber es sollte hier angemerkt werden, dass vor der Ausführung ++ x x, das Inkrementieren auf die tatsächliche x -x -.
Dann ist es sehr einfach. X+Y +++ x ist 6+10+7 ist 23. Glücklicherweise können Sie den Bytecode des Codes übersetzen und die Bytecode verwenden, um ihn zu überprüfen, und Sie können solche Ergebnisse auch finden.
Schauen wir uns ein anderes Beispiel an, das von den großen Jungs in der Gruppe bereitgestellt wurde. Ich denke, es ist auch sehr einfach.
public static int plus (int i) {try {++ i; System.out.println ("try"); return i ++; } endlich {System.out.println ("endlich"); i ++; // kehre I zurück; }} public static void main (String [] args) {System.out.println (test1.plus (5));};Können Sie sich vorstellen, wie viel die endgültige Ausgabe ist? Wenn Sie die Kommentare entfernen, kehren Sie aus diesem Grund nicht im endgültigen Block zurück. Denn egal ob es richtig oder falsch ist, kann immer ein bestimmter Wert zurückgegeben werden.
Zusammenfassen
Das obige ist eine detaillierte Erklärung von I ++ - und ++ I in Java -Interviewfragen, die vom Herausgeber vorgestellt wurden. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!