Le code ressemble à ceci:
classe publique TestPlusPlus {public static void main (String [] args) {int k = addAfterreturn (10); System.out.println (k); // sortie 10 int k1 = addBeForEReRurn (10); System.out.println (K1); // output 11} public static int addbeForEReTurn (int i) {return ++ i; } public static int addafterreturn (int i) {return i ++; }}À partir du niveau de bytecode,
Le bytecode de AddAfterreturn est le suivant:
0: Iload_01: Iinc 0, 14: Ireturn
C'est simple, iload_0 signifie mettre la valeur de l'élément indexé à 0 dans la table de variable locale en haut de la pile. Par conséquent, la valeur de I passée est placée sur le haut de la pile, et IINC 0,1 signifie placer le tableau variable local
Des éléments avec l'index 0 sont ajoutés à 1, et finalement Ireturn met la valeur int en haut de la pile dans le cadre de pile de l'appelant. (Les piles ici sont des piles d'opérande)
Par conséquent, IINC 0 et 1 n'affectent pas réellement la valeur retournée, donc le retour est toujours 10.
De même, AddBeForRereturn Bytecode est le suivant:
0: Iinc 0, 13: Iload_04: ireturn
Je laisserai le cas à tout le monde pour sa propre analyse. En fait, il est évident que cela incrémente d'abord, puis le met dans la pile. La valeur renvoyée est donc réellement incrémentée.
Maintenant, faisons une question d'interview que je me suis corrigée.
classe publique TestPlusplus2 {statique {x = 5; int y = 10; } statique int x, y; public static void main (String args []) {x--; myMethod (); System.out.println (x + y + ++ x); } public static void myMethod () {y = x ++ + ++ x; }}Connaissez-vous la réponse? Exécutez-le, la bonne réponse est de 23.
Si vous comprenez vraiment ce qui précède, cette question est également très simple. Tout d'abord, vous connaissez les valeurs de X et Y avant d'exécuter Main. Cela implique le mécanisme de chargement de classe. L'étape de préparation de la charge de classe attribuera la variable statique à la valeur zéro de ce type. Si int est int, il correspond à 0. Dans l'étape d'initialisation de la classe, les blocs statiques et les comportements d'attribution de variables statiques dans la classe sont collectés en fonction de l'ordre du code pour générer la méthode. Par conséquent, dans ce test, x = 5, y = 0;
Continuez à analyser, x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
x ++ n'ajoutera pas 1 avant d'exécuter l'opération d'addition suivante, tout comme le retour i ++ seulement après retour (vous pouvez comprendre le retour comme l'opération de pile ILOAD ci-dessus, et non l'instruction iRretrun), donc le premier ADD est 4, mais il faut noter ici qu'avant d'exécuter ++ x, l'incrément a déjà pris effet sur le x, donc x est déjà 5, donc le deuxième adjoint est ++ i et 6, donc y = 10.
Ensuite, c'est très simple que x + y +++ x est 6 + 10 + 7 est 23. Heureusement, si vous pouvez comprendre le bytecode, vous pouvez traduire le bytecode du code et utiliser le bytecode pour le vérifier, et vous pouvez également trouver de tels résultats.
Jetons un coup d'œil à un autre exemple, qui a été fourni par les gros gars du groupe. Je pense que c'est aussi très basique.
public static int Plus (int i) {try {++ i; System.out.println ("essai"); retour i ++; } enfin {System.out.println ("enfin"); i ++; // retour i; }} public static void main (String [] args) {System.out.println (test1.plus (5));}Pouvez-vous penser à la quantité de sortie finale? Si vous supprimez les commentaires, c'est pourquoi vous ne revenez pas dans le bloc enfin. Parce que peu importe que ce soit raison ou mal, une certaine valeur peut toujours être renvoyée.
Résumer
Ce qui précède est une explication détaillée de I ++ et ++ I dans les questions d'entrevue Java introduites par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!