La diferencia entre i ++ y ++ i (ejemplos explicativos)

 

La interpretación popular de i ++ es asignar primero y luego incrementar . De hecho, el valor asignado aquí es el valor tomado de la pila de operandos, es decir, el valor de i se inserta primero en la pila.

Y el autoincremento es el valor del autoincremento de la tabla de variables locales.

Y ++ i es lo opuesto, primero se incrementa y luego se asigna , es decir, la tabla de variables locales se incrementa y luego el valor de la tabla de variables locales se inserta en la pila.

 

A continuación, puede comprender y asimilar las siguientes cinco preguntas de muestra: Reimpreso en: Puede comprender i ++ y ++ i en detalle de un vistazo

Ejemplo 1 

int i = 0;
i = i++; 
System.out.println("i = " + i); 

Ejemplo 2 

int a = 2; 
int b = (3 * a++) + a;
System.out.println(b);

Ejemplo 3 

int a = 2;
 int b = a + (3 * a++);
System.out.println(b);

Ejemplo 4 

int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++; 
System.out.println(k);

Ejemplo 5 

int a = 0;
int b = 0;
a = a++;
b = a++;
System.out.println("a = " + a + ", b = " + b);

Respuesta ejemplo

Ejemplo 1: 0
Ejemplo 2: 9
Ejemplo 3: 8
Ejemplo 4: 8
Ejemplo 5: a = 1, b = 0

 
 

Ejemplo 1 explicación detallada 

int i = 0;
i = i++; 
System.out.println("i = " + i);  // 结果:0

Primero mire i ++, de acuerdo con el principio "primero aumente, luego regrese al valor antes del incremento", después de que yo incremente, i = 1, pero luego regrese al valor 0 antes del incremento, luego la expresión se convierte en i = 0, 0 Cuando no se asigna ningún valor a i, el valor de i es 1, pero cuando se asigna 0 a i, el valor de i se vuelve 0 nuevamente. Por lo tanto, el código de i = i ++ es un trabajo inútil, porque el valor de i sigue siendo el mismo al final. 
 

Ejemplo 2 en detalle 

int a = 2;
 int b = (3 * a++) + a;
System.out.println(b);   // 结果:9

int b = (3 * a ++) + a; después de a ++, a = 3, y devuelve el valor 2 antes del incremento, por lo que la expresión en este momento es: 
int b = (3 * 2) + a; el valor de a en este momento ya es 3, y la expresión se convierte en: 
int b = (3 * 2) + 3; entonces b = 9 
 

Ejemplo 3 explicación detallada 

int a = 2; 
int b = a + (3 * a++);
System.out.println(b); // 结果:8

Esta pregunta es casi la misma que en el Ejemplo 2, acabo de cambiar el orden, ¿por qué el resultado es diferente? Esto requiere el uso del "principio de expresión": una variable también es una expresión, la suma y resta de múltiples expresiones Los cálculos se realizan a partir de de izquierda a derecha 
int b = a + (3 * a ++); de acuerdo con el pensamiento de la gente común, primero se calcula 3 * a ++, a se incrementa primero en a = 3, y luego se devuelve el valor 2 antes del incremento, por lo que este Cuando la expresión se convierte en: 
int b = a + (3 * 2); en este momento el valor de a es 3, y la expresión se convierte en: 
int b = 3 + (3 * 2); el resultado b = 9 
decimos una Variables también son expresiones. Las operaciones de suma y resta de múltiples expresiones se llevan a cabo de izquierda a derecha. Es posible que no tenga una comprensión profunda de esta teoría, pero puede comprenderla si cambio un poco el código, de la siguiente manera: 
int b = (a * 1) + (3 * a ++) Este código es el mismo que int b = a + (3 * a ++), no hay diferencia, pero al mirar (a * 1) puedes saber fácilmente que tienes que cuente un * 1 primero Para esta expresión, el resultado de la expresión es 2. 
Por lo tanto, aunque la anterior a en int b = a + (3 * a ++) es solo una variable, también es una expresión. La expresión a y la expresión (3 * a ++) se suman. Todos los cálculos se realizan desde de izquierda a derecha, por lo que primero calcula la expresión a, el resultado del cálculo de una expresión es 2, por lo que la expresión se convierte en: 
int b = 2 + (3 * a ++) Luego a se incrementa y se devuelve de Aumenta el valor anterior en 2, entonces la expresión se convierte en: 
int b = 2 + (3 * 2); entonces el resultado es 8. En este momento el valor de a es 3 
 

Ejemplo 4 explicación detallada 

int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++; 
System.out.println(k);  // 结果:8

Con la explicación detallada de los tres ejemplos anteriores, creo que puede responder a este por sí mismo. Puede responderlo usted mismo primero y ver si el resultado es 8. Si no es así, mire mi explicación a continuación: El 
principio de expresión dice que hay múltiples expresiones. Las operaciones de suma y resta se llevan a cabo de izquierda a derecha, las expresiones aquí son: i ++, ++ i, ++ j, j ++, que son todas sumas, entonces podemos calcular estas 4 expresiones de de izquierda a derecha y está bien, de la siguiente manera: 
1. Primero calcule i ++, después de i ++, el valor de i es 2 y devuelva el valor 1 antes de ++, por lo que la expresión completa puede convertirse en: 
1 + ++ i + + + j + j ++; // this El valor de i es 2 
2. Luego calcula ++ i. Después de ++ i, el valor de i es 3, y se devuelve 3, por lo que la expresión completa puede convertirse en: 
1 + 3 + ++ j + j ++; // En este punto El valor de i es 3 
3. Luego, calcula ++ j. Después de ++ j, el valor de j es 2 y devuelve 2. Entonces la expresión completa puede convertirse en: 
1 + 3 + 2 + j ++; // El valor de j en este momento es 2 
4, y luego calcule j ++. Después de j ++, el valor de j es 3 y devuelve 2, por lo que la expresión completa puede convertirse en: 
1 + 3 + 2 + 2; // El resultado es 8 y el valor de j es 3 
 

Ejemplo 5 en detalle 

int a = 0;
int b = 0;
a = a++;
b = a++;
System.out.println("a = " + a + ", b = " + b); // a = 1, b = 0

Cuando se trata de la pregunta 5, parece que no hay ninguna dificultad. Todos deberían poder resolverlo. Pero para que el artículo sea completo, lo desglosaré. Primero debes calcularlo tú mismo y luego mirar mi descomposición. : 
a = a ++; Después de a ++, el valor de a es 1 y devuelve 0, por lo que el valor de a se cambia de 1 a 0 b = a ++; después de a ++, el valor de a es 1 y devuelve 0, y 0 es asignado a b, por lo que b es 0, ¡y a sigue siendo 1! !
 

 

Supongo que te gusta

Origin blog.csdn.net/qq_44624536/article/details/115125198
Recomendado
Clasificación