El código se ve así:
public class testplusplus {public static void main (string [] args) {int k = addafterReturn (10); System.out.println (k); // Salida 10 int k1 = addbeforReTurn (10); System.out.println (K1); // salida 11} public static int addbeforReTurn (int i) {return ++ i; } public static int addafterReturn (int i) {return i ++; }}Desde el nivel de bytecode,
El bytecode de addafterreturn es el siguiente:
0: ILOAD_01: Iinc 0, 14: Ireturn
Es simple, iload_0 significa poner el valor del elemento indexado a 0 en la tabla de variables locales en la parte superior de la pila. Por lo tanto, el valor de I pasado se coloca en la parte superior de la pila, e iinc 0,1 significa colocar la tabla de variables locales
Los elementos con el índice 0 se agregan a 1, y finalmente Ireturn coloca el valor INT en la parte superior de la pila en el marco de la pila de la persona que llama. (Las pilas aquí son pilas de operandos)
Por lo tanto, IINC 0 y 1 en realidad no afectan el valor devuelto, por lo que la devolución sigue siendo 10.
Del mismo modo, AddBorereturn Bytecode es el siguiente:
0: Iinc 0, 13: ILOAD_04: Ireturn
Lo dejaré a todos para su propio análisis. De hecho, es obvio que esto se está incrementando primero y luego ponerlo en la pila. Entonces, el valor devuelto se incrementa en realidad.
Ahora hagamos una pregunta de entrevista que me he corregido.
clase pública 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; }}¿Sabes la respuesta? Ejecutarlo, la respuesta correcta es 23.
Si realmente entiendes lo anterior, esta pregunta también es muy simple. En primer lugar, conoce los valores de X e Y antes de ejecutar Main. Esto implica el mecanismo de carga de clase. La etapa de preparación de la carga de clase asignará la variable estática al valor cero de este tipo. Si int es int, corresponde a 0. En la etapa de inicialización de la clase, los bloques estáticos y los comportamientos de asignación de variables estáticas en la clase se recopilan de acuerdo con el orden de código para generar el método. Por lo tanto, en esta prueba, x = 5, y = 0;
Continuar analizando, x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
X ++ no agregará 1 antes de ejecutar la operación de adición posterior, al igual que el retorno i ++ solo después de la retorno (puede comprender la devolución como la operación de pila ILOAD anterior, no la instrucción de Iretrun), por lo que el primer ADD 4, pero aquí se notará aquí que antes de ejecutar ++ x, incrementando ya ha tenido efecto en la X, es decir, X, X es 5, por lo que el segundo excremento es ++ I y 6, SO ya se ha tomado efecto en la X, es decir, X, es 5, por lo que el segundo excremento es ++ I y 6, SO.
Entonces es muy simple x+y +++ x es 6+10+7 es 23. Afortunadamente, si puede comprender el código de byte, puede traducir el código de byte del código y usar el bytecode para verificarlo, y también puede encontrar tales resultados.
Echemos un vistazo a otro ejemplo, que fue proporcionado por los grandes del grupo. Creo que también es muy básico.
public static int Plus (int i) {try {++ i; System.out.println ("Prueba"); devolver i ++; } finalmente {System.out.println ("finalmente"); i ++; // devolver i; }} public static void main (string [] args) {System.out.println (test1.plus (5));}¿Puedes pensar cuánto es la salida final? Si elimina los comentarios, es por eso que no regresa en el bloque Finalmente. Porque no importa si es correcto o incorrecto, siempre se puede devolver un cierto valor.
Resumir
Lo anterior es una explicación detallada de I ++ y ++ I en las preguntas de la entrevista de Java presentadas por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!