¿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.


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.


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.


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;

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.


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.


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

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!


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.


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

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

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.


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

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.


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.