¿Cómo funcionan los operadores de incremento posterior (i ++) y incremento previo (++ i) en Java?

99

¿Puede explicarme la salida de este código Java?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

La salida es 20 en ambos casos.

Ankit Sachan
fuente
9
Evite siempre las declaraciones ambiguas :)
Prasoon Saurav
9
@Prasoon Saurav A diferencia de C y C ++, Java y C # tienen un orden de evaluación estrictamente definido, por lo que estas declaraciones no son ambiguas.
Pete Kirkham
12
Lo sé, pero aún así esas declaraciones no se utilizan (no pueden) utilizarse con fines prácticos, por lo que hay que evitarlas.
Prasoon Saurav
4
@PeteKirkham Han pasado más de seis años, pero aún quiero señalar que "ambiguo", en esta situación, es ambiguo: podría significar "el compilador no sabe qué poner", o podría significar "El programador no tiene idea de lo que significa ".
Financia la demanda de Monica el

Respuestas:

150

¿Esto ayuda?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

El punto principal es que ++aincrementa el valor y lo devuelve inmediatamente.

a++ también incrementa el valor (en segundo plano) pero devuelve el valor sin cambios de la variable, lo que parece que se ejecuta más tarde.

kgiannakakis
fuente
5
¿Estás seguro de un == 9 en el segundo?
Pete Kirkham
1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) dado que el incremento posterior tiene la mayor prioridad, ¿se ejecuta a ++ primero?
rsirs
2
ejemplo complicado a algo que es fácil de explicar.
oznus
¿Esta respuesta es la misma para c # y c ++?
workoverflow
¿Por qué a, byc son iguales a 2 aquí? int a = 1; int b = a++; int c = ++b;Esperaba que b fuera 1 ya que es un incremento posterior.
Dennis
202

++aincrementa y luego usa la variable.
a++usa y luego incrementa la variable.

Si usted tiene

a = 1;

y lo hace

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

codaddict explica su fragmento particular.

Lombo
fuente
62

En ambos casos, primero calcula el valor, pero en el incremento posterior mantiene el valor anterior y después del cálculo lo devuelve.

++ a

  1. a = a + 1;
  2. return a;

a ++

  1. temp = a;
  2. a = a + 1;
  3. temperatura de retorno;
Tigran Babajanyan
fuente
8
Respuesta más
clara
2
este fue el que me hizo entender claramente .. gracias.
rematnarab
22
i = ++a + ++a + a++;

es

i = 6 + 7 + 7

En funcionamiento : incremento a 6 (valor actual 6) + incremento a 7 (valor actual 7). La suma es 13 ahora agréguelo al valor actual de a (= 7) y luego incremente a 8. La suma es 20 y el valor de a después de que se completa la asignación es 8.

i = a++ + ++a + ++a;

es

i = 5 + 7 + 8

De trabajo : En el valor inicial es de un 5. Uso en la adición y luego se incrementa a 6 (valor actual 6). Incremente a del valor actual 6 a 7 para obtener otro operando de +. La suma es 12 y el valor actual de a es 7. A continuación, incremente a de 7 a 8 (valor actual = 8) y súmelo a la suma anterior 12 para obtener 20.

codaddict
fuente
Estas declaraciones funcionan de derecha a izquierda o de izquierda a derecha?
Abhijeet
10

++aincrementos aantes de que se evalúe. a++lo evalúa ay luego lo incrementa.

Relacionado con su expresión dada:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

Los parenteses que utilicé anteriormente son utilizados implícitamente por Java. Si observa los términos de esta manera, puede ver fácilmente que ambos son iguales ya que son conmutativos.

Aurril
fuente
1
@ KlasLindbäck conmutativo significa que puede intercambiar ambas expresiones y aún obtener el mismo resultado. Entonces a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 al final).
Aurril
8

En el ejemplo anterior

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29
vinod
fuente
4

++ a es el operador de incremento de prefijo:

  • el resultado se calcula y almacena primero,
  • entonces se usa la variable.

a ++ es un operador de incremento postfijo:

  • la variable se usa primero,
  • luego, el resultado se calcula y se almacena.

Una vez que recuerde las reglas, ¡EZ para que calcule todo!

Xinyi Liu
fuente
4

Suponiendo que quisiste decir

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

Esto se evalúa como:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

entonces i es 6 + 7 + 7 = 20 y así se imprime 20.

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

entonces i es 5 + 7 + 8 = 20 y entonces 20 se imprime nuevamente.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

y después de evaluar todo el lado derecho (incluida la configuración de a en 8) ENTONCES a se establece en 6 + 7 + 7 = 20 y, por lo tanto, 20 se imprime por última vez.

usuario93199
fuente
3

cuando aes 5, le a++da un 5 a la expresión y aluego se incrementa , mientras que se ++aincrementa aantes de pasar el número a la expresión (que da a6 a la expresión en este caso).

Entonces tu calculas

i = 6 + 7 + 7
i = 5 + 7 + 8
Thorbjørn Ravn Andersen
fuente
3

Sin embargo, creo que si combina todas sus declaraciones y lo ejecuta en Java 8.1, obtendrá una respuesta diferente, al menos eso es lo que dice mi experiencia.

El código funcionará así:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29
Rishabh Vashishtha
fuente
3

Pre-incremento significa que la variable se incrementa ANTES de que se evalúe en la expresión. Post-incremento significa que la variable se incrementa DESPUÉS de que se haya evaluado para su uso en la expresión.

Por lo tanto, mire con atención y verá que las tres asignaciones son aritméticamente equivalentes.

Oke Uwechue
fuente
2

preincremento y postincremento son equivalentes si no están en una expresión

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10
Java Main
fuente
0
a=5; i=++a + ++a + a++;

es

i = 7 + 6 + 7

En funcionamiento: el incremento pre / post tiene asociatividad "de derecha a izquierda", y pre tiene precedencia sobre el post, por lo que en primer lugar el incremento pre se resolverá como (++a + ++a) => 7 + 6. luego a=7se proporciona para publicar incremento => 7 + 6 + 7 =20y a =8.

a=5; i=a++ + ++a + ++a;

es

i=7 + 7 + 6

En funcionamiento: el incremento pre / post tiene asociatividad "de derecha a izquierda", y pre tiene precedencia sobre el post, por lo que, en primer lugar, el incremento previo se resolverá ya que, a (++a + ++a) => 7 + 6continuación, a=7se proporciona post incremento => 7 + 7 + 6 =20y a =8.

Vineet Sahu
fuente
0

Creo que está ejecutando todas estas declaraciones de manera diferente si se
ejecutan juntas dará como resultado => 38, 29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
Randhawa
fuente