Чи є різниця між ++ x і x ++ у Java?
Чи є різниця між ++ x і x ++ у Java?
Відповіді:
++ x називається попередньою, а x ++ називається постінкрементною.
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
так
++ x збільшує значення x, а потім повертає x
x ++ повертає значення x, а потім з кроком
приклад:
x=0;
a=++x;
b=x++;
після запуску коду і a, і b буде 1, але x буде 2.
Вони відомі як оператори постфікса та префікса. Обидва додадуть 1 до змінної, але є різниця в результаті заяви.
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
?
так,
int x=5;
System.out.println(++x);
буде друкувати 6
і
int x=5;
System.out.println(x++);
надрукує 5
.
Я приземлився сюди від одного з своїх останніх копій , і хоча на це питання більше, ніж відповіді, я не міг не розшифрувати код і додати "ще одну відповідь" :-)
Щоб бути точним (і, мабуть, трохи педантичним),
int y = 2;
y = y++;
складається в:
int y = 2;
int tmp = y;
y = y+1;
y = tmp;
Якщо ви javac
цей Y.java
клас:
public class Y {
public static void main(String []args) {
int y = 2;
y = y++;
}
}
і javap -c Y
, ви отримуєте наступний код jvm (я дозволив мені коментувати основний метод за допомогою специфікації Java Virtual Machine ):
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
}
Таким чином, ми нарешті:
0,1: y=2
2: tmp=y
3: y=y+1
6: y=tmp
Розглядаючи, що насправді робить комп'ютер ...
++ x: завантажуйте x з пам'яті, збільшуючи, використовуйте, зберігайте назад у пам'яті.
x ++: завантажте x з пам'яті, використовуйте, збільшуючи, зберігайте назад у пам'яті.
Розглянемо: a = 0 x = f (a ++) y = f (++ a)
де функція f (p) повертає p + 1
х буде 1 (або 2)
y буде 2 (або 1)
І в цьому криється проблема. Чи передав автор компілятора параметр після пошуку, після використання або після зберігання.
Як правило, просто використовуйте x = x + 1. Це набагато простіше.
У Java існує різниця між x ++ та ++ x
++ x - форма префікса: вона збільшує вираз змінних, а потім використовує нове значення у виразі.
Наприклад, якщо використовується в коді:
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 ++ - це форма постфіксу: значення змінних спочатку використовується в виразі, а потім збільшується після операції.
Наприклад, якщо використовується в коді:
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'
Сподіваюся, це зрозуміло. Біг та гра з вищевказаним кодом повинні допомогти вам зрозуміти.
Так.
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);
}
}
Так, повернене значення - це значення після та до збільшення відповідно.
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
Гаразд, я приземлився тут, тому що нещодавно зіткнувся з тим же питанням під час перевірки класичної реалізації стека. Лише нагадування про те, що це використовується в реалізації масиву Stack на основі масиву, який трохи швидше, ніж зв'язаним списком.
Код нижче, перевірте функцію push і 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;
}
}
Так, є різниця, у випадку x ++ (постінкремент) значення x буде використано у виразі, а x буде збільшено на 1 після того, як вираз буде оцінено, з іншого боку ++ x (попереднє збільшення), x + 1 буде використаний у виразі. Візьмемо приклад:
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);
}
На питання вже відповіли, але дозвольте мені також додати мою сторону.
Насамперед ++ означає приріст на одне і - означає зменшення на одне.
Тепер x ++ означає приріст x після цього рядка, а ++ x означає збільшення x перед цим рядком.
Перевірте цей приклад
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);
}
}
Він дасть такий вихід:
x=19 a=17
x=19 b=19
x=18 a=19
x=17 b=17
З i ++ це називається постінкремент, і значення використовується в будь-якому контексті, а потім збільшується; ++ i спочатку збільшує значення, а потім використовує його в контексті.
Якщо ви не використовуєте його в будь-якому контексті, не має значення, яким ви користуєтесь, але післязростання використовується умовно.
Є величезна різниця.
Оскільки більшість відповідей уже вказували на теорію, я хотів би зазначити простий приклад:
int x = 1;
//would print 1 as first statement will x = x and then x will increase
int x = x++;
System.out.println(x);
Тепер подивимось ++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);