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