¿Hay alguna diferencia entre x ++ y ++ x en java?


113

¿Hay alguna diferencia entre ++ x y x ++ en java?


53
Cue un torrente de respuestas idénticas ...
skaffman

5
... y votación a favor de la primera de las respuestas idénticas para entrar ...
skaffman

9
para que el botín sea más rápido, ordene por más antiguo, haga clic en votar a favor. ohowoho.
dotjoe

1
¡Estaba seguro de que lo tenía! La respuesta de Emil es mejor de todos modos.
Victor

Respuestas:


290

++ x se denomina preincremento, mientras que x ++ se denomina postincremento.

int x = 5, y = 5;

System.out.println(++x); // outputs 6
System.out.println(x); // outputs 6

System.out.println(y++); // outputs 5
System.out.println(y); // outputs 6

62
Buena explicación, 1 ++. Vaya, ++ 1 :)
nawfal

67

si

++ x incrementa el valor de x y luego devuelve x
x ++ devuelve el valor de x y luego incrementa

ejemplo:

x=0;
a=++x;
b=x++;

después de ejecutar el código, tanto a como b serán 1 pero x será 2.


10
+1 Muchos ejemplos, esta es una explicación con ejemplos :)
Jeremy Smyth

1
Sí, también terminé votando este por la clara explicación en prosa al principio. (Hmm, no sabía que puedes
usar

17

Estos se conocen como operadores de sufijo y prefijo. Ambos agregarán 1 a la variable, pero hay una diferencia en el resultado de la declaración.

int x = 0;
int y = 0;
y = ++x;            // result: y=1, x=1

int x = 0;
int y = 0;
y = x++;            // result: y=0, x=1

¿No debería serlo suffix?
HyperNeutrino

10

Si,

int x=5;
System.out.println(++x);

imprimirá 6y

int x=5;
System.out.println(x++);

imprimirá 5.


1
@ Tom, solo estaba considerando cómo emitir mis votos, así que aquí está mi interpretación: una pequeña razón para preferir la respuesta de Emil H es que su código de ejemplo es / un poco / más informativo.
Jonik

Jonik. Es cierto, también incluye las palabras clave "preincrement" y "postincrement".
Tom

Esta "respuesta" solo le dice una salida de caso de prueba, y considero que las salidas no son respuestas. Por el contrario, normalmente el resultado (inesperado) de alguna ejecución de código conduce a la pregunta. De ahí mi voto en contra.
Alberto de Paola

8

Aterricé aquí desde uno de sus duplicados recientes , y aunque esta pregunta está más que respondida, no pude evitar descompilar el código y agregar "otra respuesta más" :-)

Para ser exactos (y probablemente un poco pedantes),

int y = 2;
y = y++;

se compila en:

int y = 2;
int tmp = y;
y = y+1;
y = tmp;

Si eres de javacesta Y.javaclase:

public class Y {
    public static void main(String []args) {
        int y = 2;
        y = y++;
    }
}

y javap -c Yobtienes el siguiente código jvm (me permití comentar el método principal con la ayuda de la Especificación de la máquina virtual Java ):

public class Y extends java.lang.Object{
public Y();
  Code:
   0:   aload_0
   1:   invokespecial  #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_2 // Push int constant `2` onto the operand stack. 

   1:   istore_1 // Pop the value on top of the operand stack (`2`) and set the
                 // value of the local variable at index `1` (`y`) to this value.

   2:   iload_1  // Push the value (`2`) of the local variable at index `1` (`y`)
                 // onto the operand stack

   3:   iinc  1, 1 // Sign-extend the constant value `1` to an int, and increment
                   // by this amount the local variable at index `1` (`y`)

   6:   istore_1 // Pop the value on top of the operand stack (`2`) and set the
                 // value of the local variable at index `1` (`y`) to this value.
   7:   return

}

Así, finalmente tenemos:

0,1: y=2
2: tmp=y
3: y=y+1
6: y=tmp

7

Al considerar lo que realmente hace la computadora ...

++ x: cargar x desde la memoria, incrementar, usar, almacenar de nuevo en la memoria.

x ++: cargar x desde la memoria, usar, incrementar, almacenar de nuevo en la memoria.

Considere: a = 0 x = f (a ++) y = f (++ a)

donde la función f (p) devuelve p + 1

x será 1 (o 2)

y será 2 (o 1)

Y ahí radica el problema. ¿El autor del compilador pasó el parámetro después de la recuperación, después del uso o después del almacenamiento?

Generalmente, use x = x + 1. Es mucho más simple.


5

En Java hay una diferencia entre x ++ y ++ x

++ x es una forma de prefijo: incrementa la expresión de las variables y luego usa el nuevo valor en la expresión.

Por ejemplo, si se usa en el código:

int x = 3;

int y = ++x;
//Using ++x in the above is a two step operation.
//The first operation is to increment x, so x = 1 + 3 = 4
//The second operation is y = x so y = 4

System.out.println(y); //It will print out '4'
System.out.println(x); //It will print out '4'

x ++ es una forma de sufijo: el valor de las variables se usa primero en la expresión y luego se incrementa después de la operación.

Por ejemplo, si se usa en el código:

int x = 3;

int y = x++;
//Using x++ in the above is a two step operation.
//The first operation is y = x so y = 3
//The second operation is to increment x, so x = 1 + 3 = 4

System.out.println(y); //It will print out '3'
System.out.println(x); //It will print out '4' 

Espero que esto quede claro. Ejecutar y jugar con el código anterior debería ayudarlo a comprender.


3

Si.

public class IncrementTest extends TestCase {

    public void testPreIncrement() throws Exception {
        int i = 0;
        int j = i++;
        assertEquals(0, j);
        assertEquals(1, i);
    }

    public void testPostIncrement() throws Exception {
        int i = 0;
        int j = ++i;
        assertEquals(1, j);
        assertEquals(1, i);
    }
}

2

Sí, al usar ++ X, se usará X + 1 en la expresión. Al usar X ++, X se usará en la expresión y X solo aumentará después de que se haya evaluado la expresión.

Entonces, si X = 9, usando ++ X, se usará el valor 10, de lo contrario, el valor 9.


2

Si es como muchos otros idiomas, puede intentarlo de forma sencilla:

i = 0;
if (0 == i++) // if true, increment happened after equality check
if (2 == ++i) // if true, increment happened before equality check

Si lo anterior no sucede así, pueden ser equivalentes


2

Sí, el valor devuelto es el valor antes y después del incremento, respectivamente.

class Foo {
    public static void main(String args[]) {
        int x = 1;
        int a = x++;
        System.out.println("a is now " + a);
        x = 1;
        a = ++x;
        System.out.println("a is now " + a);
    }
}

$ java Foo
a is now 1
a is now 2

1

OK, aterricé aquí porque recientemente encontré el mismo problema al verificar la implementación de la pila clásica. Solo un recordatorio de que esto se usa en la implementación basada en matrices de Stack, que es un poco más rápida que la de lista vinculada.

Código a continuación, verifique la función push y pop.

public class FixedCapacityStackOfStrings
{
  private String[] s;
  private int N=0;

  public FixedCapacityStackOfStrings(int capacity)
  { s = new String[capacity];}

  public boolean isEmpty()
  { return N == 0;}

  public void push(String item)
  { s[N++] = item; }

  public String pop()
  { 
    String item = s[--N];
    s[N] = null;
    return item;
  }
}

1

Sí, hay una diferencia, en caso de x ++ (posincremento), el valor de x se usará en la expresión y x se incrementará en 1 después de que la expresión haya sido evaluada, por otro lado ++ x (preincremento), x + Se usará 1 en la expresión. Tome un ejemplo:

public static void main(String args[])
{
    int i , j , k = 0;
    j = k++; // Value of j is 0
    i = ++j; // Value of i becomes 1
    k = i++; // Value of k is 1
    System.out.println(k);  
}

1

La Pregunta ya está respondida, pero permítame agregar desde mi lado también.

Primero de todo, ++ significa incremento en uno y - significa decremento en uno.

Ahora x ++ significa Incremento x después de esta línea y ++ x significa Incremento x antes de esta línea.

Ver este ejemplo

class Example {
public static void main (String args[]) {
      int x=17,a,b;
      a=x++;
      b=++x;
      System.out.println(“x=” + x +“a=” +a);
      System.out.println(“x=” + x + b=” +b);
      a = x--;
      b = --x;
      System.out.println(“x=” + x + a=” +a);
      System.out.println(“x=” + x + b=” +b);
      }
}

Dará la siguiente salida:

x=19 a=17
x=19 b=19
x=18 a=19
x=17 b=17

1
Esta respuesta sería incluso mejor si estuviera acompañada de algunas palabras de explicación.
Thom

0

Con i ++, se llama postincremento, y el valor se usa en cualquier contexto que luego se incremente; ++ i is preincrement incrementa el valor primero y luego lo usa en contexto.

Si no lo usa en ningún contexto, no importa lo que use, pero el poscremento se usa por convención.


0

Hay una gran diferencia.

Como la mayoría de las respuestas ya han señalado la teoría, me gustaría señalar un ejemplo sencillo:

int x = 1;
//would print 1 as first statement will x = x and then x will increase
int x = x++;
System.out.println(x);

Ahora veamos ++x:

int x = 1;
//would print 2 as first statement will increment x and then x will be stored
int x = ++x;
System.out.println(x);
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.