¿Hay alguna diferencia entre ++ x y x ++ en java?
¿Hay alguna diferencia entre ++ x y x ++ en java?
Respuestas:
++ 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
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.
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
suffix
?
Si,
int x=5;
System.out.println(++x);
imprimirá 6
y
int x=5;
System.out.println(x++);
imprimirá 5
.
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 javac
esta Y.java
clase:
public class Y {
public static void main(String []args) {
int y = 2;
y = y++;
}
}
y javap -c Y
obtienes 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
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.
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.
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);
}
}
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
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;
}
}
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);
}
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
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);