variable una significa operadores incremento incrementales entre diferencia decremento java loops for-loop infinite-loop post-increment

java - una - Operador de incremento de publicación que no se incrementa en bucle for



operadores incrementales (4)

Está usando un incremento posterior: i = i++; , significa algo como esto:

temp = i; i = i + 1; i = temp;

porque 15.14.2 Operador de Incremento de Postfix ++ :

El valor de la expresión de incremento postfix es el valor de la variable antes de que se almacene el nuevo valor.

Es por eso que tienes el valor anterior.

For-loop hecho a la derecha:

for (int i = 0; i < 10; i++) { System.err.print("hoo... "); }

Estoy investigando sobre Java y encuentro esto muy confuso:

for (int i = 0; i < 10; i = i++) { System.err.print("hoo... "); }

¡Esto nunca termina con el ciclo!

¿Alguien tiene una buena explicación de por qué sucede eso?


i ++ informará el valor de i, y luego aumentará. Esto también significa que no necesita establecer i igual a i ++, solo cambie a

for (int i = 0; i < 10; i++) {


por i = i ++

for (int i = 0; i < 10; i++) { System.err.print("hoo... "); }


for (int i = 0; i < 10; i = i++) {

El ciclo anterior es esencialmente el mismo que:

for (int i = 0; i < 10; i = i) {

la parte de su enunciado for - i = i++ , se evalúa como: -

int oldValue = i; i = i + 1; i = oldValue; // 3rd Step

Debes eliminar la tarea desde allí para que funcione:

for (int i = 0; i < 10; i++) {

(En la solicitud OP de Comentarios)

Comportamiento de x = 1; x = x++ + x++; x = 1; x = x++ + x++; : -

En cuanto a su problema como se especifica en el comentario, el resultado de la siguiente expresión:

x = 1; x = x++ + x++;

se obtiene de la siguiente manera:

Marquemos diferentes partes de la segunda afirmación:

x = x++ + x++; R A B

Ahora, primero se evaluará la parte RHS (A + B) y luego se asignará el resultado final a x . Entonces, avancemos.

Primero A se evalúa:

old1 = x; // `old1 becomes 1` x = x + 1; // Increment `x`. `x becomes 2` //x = old1; // This will not be done. As the value has not been assigned back yet.

Ahora, dado que la asignación de A a R no se realiza aquí, el 3er paso no se realiza.

Ahora, pase a la evaluación B :

old2 = x; // old2 becomes 2. (Since `x` is 2, from the evaluation of `A`) x = x + 1; // increment `x`. `x becomes 3`. // x = old2; // This will again not be done here.

Ahora, para obtener el valor de x++ + x++ , tenemos que hacer la última tarea que dejamos en la evaluación de A y B , porque ahora es el valor asignado en x . Para eso, tenemos que reemplazar:

A --> old1 B --> old2 // The last assignment of both the evaluation. (A and B) /** See Break up `x = old1;` towards the end, to understand how it''s equivalent to `A = old1; in case of `x = x++`, considering `x++ <==> A` in this case. **/

Entonces, x = x++ + x++ , se convierte en: -

x = old1 + old2; = 1 + 2; = 3; // Hence the answer

Desglose de la tercera parte de x = x++ , para ver cómo funciona en x = x++ + x++ caso: -

A --> old1 pregunto por qué el reemplazo se hace como A --> old1 y no x --> old1 , como en el caso de x = x++ .

Eche un vistazo profundo a la parte x = x++ , especialmente la última tarea:

x = oldValue;

si considera que x++ es A aquí, la tarea anterior se puede dividir en estos pasos:

A = oldValue; x = A;

Ahora, para el problema actual, es lo mismo que:

A = old1; B = old2; x = A + B;

Espero que eso lo aclare.