La diferencia entre ++Var y Var++ [duplicar]


Esta pregunta ya tiene una respuesta aquí:

En programación, particularmente en Java, ¿cuál es la diferencia entre:

int var = 0;
var++;

Y

int var = 0;
++var;

¿Qué repercusiones tendría esto en un bucle for?

Por ejemplo

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

for (int i = 0; i < 10; ++i) {}
Author: Boann, 2011-05-30

8 answers

Tldr;

Aunque tanto var++ como ++var incrementan la variable a la que se aplican, el resultado devuelto por var++ es el valor de la variable antes del incremento, mientras que el resultado devuelto por ++var es el valor de la variable después de que se aplique el incremento.

Explicación adicional

Cuando ++var o var++ forman una declaración completa (como en sus ejemplos) no hay diferencia entre los dos. Por ejemplo, el siguiente

int x = 6;
++x;
assert x == 7;

Es idéntico a

int x = 6;
x++;
assert x == 7;

Sin embargo, cuando ++var o var++ se utilizan como parte de una declaración más grande, los dos pueden no ser equivalentes. Por ejemplo, la siguiente aserción pasa

int x = 6;
assert ++x == 7;

Mientras que éste falla

int x = 6;
assert x++ == 7;

Aunque tanto var++ como ++var incrementan la variable a la que se aplican, el resultado devuelto por var++ es el valor de la variable antes del incremento, mientras que el resultado devuelto por ++var es el valor de la variable después del incremento es aplicar.

Cuando se usa en un bucle for, no hay diferencia entre los dos porque el incremento de la variable no forma parte de una instrucción más grande. Puede que no aparezca de esta manera, porque hay otro código en la misma línea del archivo fuente. Pero si miras de cerca, verás que hay un ; inmediatamente antes del incremento y nada después, por lo que el operador de incremento no forma parte de una sentencia más grande.

 106
Author: Dónal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-16 02:50:04

++var es el operador pre-incremento; incrementa el valor de var antes de evaluar la expresión. Del mismo modo, var++ es el operador post-incremento; incrementa el valor de var después de evaluar la expresión.

En el caso de un bucle simple, no hay diferencia entre dos, porque las expresiones ++var; y var++; ambas dan el mismo resultado.

Para más información, ver por ejemplo http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#IncDecOps.

 12
Author: Eser Aygün,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-30 10:58:04

int a = 5, b;

Post incremento : b = a++; : a se transfieren primero a b y luego a se incrementa, por lo que ahora b es 5, y a es 6 El efecto es b = a; a = a + 1;

Pre incremento: b = ++a; : primero a se incrementa y luego el resultado se transfiere a b, así que ahora a es 7 y también b es 7. El efecto es a = a + 1; b = a

a++ y ++a permanecer independientemente actuar de la misma manera. En el bucle ejemplos que tienes presentados, los operadores de incremento no están asociados en ninguna expresión, y son independientes. Por lo tanto, estos dos en esta implementación particular son idénticos.

 10
Author: phoxis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-30 10:55:11

En sus ejemplos, no hay diferencia, hay sin embargo una diferencia entre:

int var = 0;
int var2 = ++var;

Y:

int var = 0;
int var2 = var++;

En el primer caso, el valor de var2 es 1, mientras que en el segundo, es 0.

 6
Author: Maurice Perry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-30 10:54:26

Var++ devuelve su valor antes de incrementarlo.
++var devuelve su valor después de incremento.

int var = 0;
System.out.println(var++); // returns 0;

var = 0;
System.out.println(++var); // returns 1
 5
Author: Patryk Dobrowolski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-12 21:18:12

++i es preincremento, se hace antes de cualquier cosa en la expresión que aparece.

I++ es postdecrement, se hace después de cualquier cosa en la expresión que aparece.

En el primer bucle, se ejecutará de 0 a 9. En el segundo, se ejecutará de 1 a 9.

Mi consejo: evite ambos (las excepciones pueden ser i++; o el primer bucle). Demasiado difícil de buscar en la expresión.

Pasé un largo día depurando

MyArray [(i++)%16] = data

Y tratando de encuentre por qué intentó escribir en datos[16] a veces

 0
Author: SJuan76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-30 10:55:17

De hecho, esto es bastante simple. El preincremento ++i se ejecuta primero en la declaración.

j = ++i +1;

Es equivalente a

i = i+1;
j = i+1;

Considerando que el post increment i++ se ejecuta al final;

j = i++ +1;

Es equivalente a

j = i+1;
i = i+1;
 0
Author: Eilistraee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-30 10:57:50

Tanto ++var como var++ son idénticos cuando aparecen solo en la expresión. Esto se aplica a su pregunta porque usted tiene solo ++i, i++

La diferencia solo tiene lugar cuando los alineas:

int x = 0;
printf( "%d %d\n", ++x, x ); // 1 1
printf( "%d %d\n", x++, x ); // 1 2

Cómo recordar?

Cuando vea primero el operador, luego incremente y luego tome valor.

Cuando vea primero la variable, luego tome el valor y luego el incremento.

Así que en el primer ejemplo se ven valores iguales porque:

you increment `x`, then access `x`, then access `x` again  

Así que en el segundo ejemplo ves diferencias porque:

you access `x`, then increment `x`, then access `x` again
 0
Author: Eugen Konkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-20 15:08:03