English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Anterior++Y posterior++ Explicación detallada de las operaciones y ejemplos de código

Notas de experiencia1Texto1Se considera que el ++ anterior suma primero el valor de la variable++Después, participa en las operaciones con el valor aumentado1.

Primero utiliza este valor para participar en las operaciones, luego suma este valor.

package test;
public class Plus_Test01 {
 public static void main(String[] args) {
  int i = 10int k =
  Primero, observa el primer ejemplo:++;
  i = i
 }
}

System.out.println(k);

System.out.println(i);

package test;
public class Plus_Test02 {
 public static void main(String[] args) {
  Veamos el segundo: 10int k =
  0;
   while (true) {++ if (k 10>
    // break;
    0) {
   }
   break;
  }
 }
}

System.out.println(k);

Adivina qué resultado es?++En realidad, ya sea anterior++Ambos suman primero el valor de la variable1La verdadera diferencia entre ellos es que el anterior++Después, suma el valor de la variable1Después, utiliza el valor aumentado de la variable para realizar operaciones. Después del aumento, el orden es:++Primero, asigna el valor de la variable a una variable temporal, luego suma el valor de la variable.1, luego utiliza esa variable temporal para realizar operaciones.

Para el siguiente fragmento de código (anterior)++):

int i=1;
int j=++i*5;

En realidad, la segunda frase es equivalente a:

i+=1; //sumar i1
j=i*5; //Añadir1El valor resultante se calcula y este resultado es:10

Para el siguiente fragmento de código (posterior)++):

int i=1;
int j=i++*5;

La segunda frase es equivalente a:

int temp=i;  // asignar i a una variable temporal
i+=1;        //sumar i1
j=temp*5;   //calcular con la variable temporal, este resultado es:5

Para el primer ejemplo, es equivalente a:

int temp=i;
i+=1;
i=temp; //

por lo tanto, el resultado debe ser inmutable, es decir100。

el código ensamblador del primer ejemplo es:

 public static void main(java.lang.String[]);
  descriptor: ([Ljava/lang/String;)V
  flags: ACC_PUBLIC, ACC_STATIC
  Code:
  stack=2, locals=2, args_size=1
   : bipush  100
   2: istore_1
   3: iload_1
   4: iinc   1, 1 //la segunda en la variable local más1
   7: istore_1    //guardar en la variable local
   8: getstatic  #16     // Field java/lang/System.out:Ljava/io/PrintStream;
   11: iload_1 //los parámetros cargados son el segundo de la pila, es decir, aún es100
   12: invokevirtual #22     // Method java/io/PrintStream.println:(I)V
   15: return

Para el segundo ejemplo, en realidad no es difícil, el resultado es101,tenga en cuenta el flujo, no cometa errores de este tipo en el futuro. (El flujo es: primero compara temp=i, temp>100, obviamente no es cierto, que i+=1,salta a la frase syso, lo que se imprime ciertamente es101,vuelva a bucle, también hay temp=i, temp>100, esta vez es verdadero, luego i+=1,salta directamente fuera del bucle, no se ejecutan las instrucciones dentro de while).

el ensamblaje del segundo ejemplo (sólo se seleccionó el método main):

 public static void main(java.lang.String[]);
  descriptor: ([Ljava/lang/String;)V
  flags: ACC_PUBLIC, ACC_STATIC
  Code:
  stack=2, locals=2, args_size=1
   : bipush  100  //100empujar
   2: istore_1     //guardar en la segunda variable local (la primera variable local es el parámetro del método)
   3: iload_1     //cargar desde la segunda variable local
   4: iinc   1, 1  //darle a la variable local2número de posición int aumenta1(el valor de la variable local aumenta, el resultado sigue en la variable local, valor en la pila de operandos superior1no cambia)
   7: bipush  100 //100empujar
   9: if_icmple  15 //compara los dos valores int en la pila de operandos superior, si el primero es menor o igual al segundo, luego salta a15línea
   12: goto   25 //de otra manera, salta a25línea (es decir, pila de operandos superior1>pila de operandos superior2)
   15: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream;
   18: iload_1 // //cargar desde la primera variable local
   19: invokevirtual #3     // Method java/io/PrintStream.println:(I)V //llame a este método
   22: goto   3 //vuelva a saltar a3,vuelva a bucle
   25: return //salir

tercer ejemplo:

 package test;
 public class Plus_Test03 {
  static int proPlus() {
   int i = 55;
   int j = ++i;
   return j; //56
  }
  static int postPlus() {
   int i = 55;
   int j = i++;
   return j; //55
  }
  public static void main(String[] args) {
  System.out.println(proPlus());//56
   System.out.println(postPlus());//55
  }
}

El ensamblaje del tercer ejemplo:

static int proPlus();
 descriptor: ()I
 flags: ACC_STATIC
 Code:
  stack=1, locals=2, args_size=0
   : bipush  55 //55Pila
   2: istore_0   //Guardar el almacenamiento del tipo int en la primera variable local
   3: iinc 0, 1 //El primer local var se añade1
   6: iload_0   //Cargar desde la variable local
   7: istore_1  //Guardar en la segunda variable local
   8: iload_1   //La pila superior es la segunda variable local
   9: ireturnstatic int postPlus();
 descriptor: ()I
 flags: ACC_STATIC
 Code:
  stack=1, locals=2, args_size=0
   : bipush  55 
   2: istore_0
   3: iload_0    //: cargar a la pila
   4: iinc 0, 1 //El primer local var se añade1
   7: istore_1
   8: iload_1
   9: ireturn

Como se puede ver, el pospuesto++ Y posterior++La diferencia radica en el paréntesis azul superior (//El primer local var se añade1) parte, estas dos partes están al revés. Para el pospuesto, se aumentará el número en local var1然后将其加载 a la pila, y el pospuesto es primero cargar desde la pila local var a la pila, luego aumentar el local var1,相当于留了一个备份。

结论:

一。前置与后置++都先将变量的值加1,而不是前置++Primero加1Luego运算,然后是后置++Primero运算然后加1.
Dos. En términos de programa, el pospuesto++Primero asigne el valor de la variable a una variable temporal, luego aumente el valor de la variable1, a continuación, utilice esa variable temporal para participar en la operación.
Tres. En términos de instrucciones, el pospuesto++Antes de ejecutar la instrucción de aumento de valor (iinc), primero presione el valor de la variable en la pila, después de ejecutar la instrucción de aumento de valor, se utiliza el valor que se presionó en la pila anterior.

Espero que con este artículo, entienda completamente lo anterior++Y posterior++¡Gracias a todos por apoyar a este sitio con las diferencias de cálculo!

Te gustaría que te gustara