Есть ли разница между ++ x и x ++ в Java?
Есть ли разница между ++ x и x ++ в Java?
Ответы:
да
++ 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 ):
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
x будет 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 is preincrement сначала увеличивает значение, а затем использует его в контексте.
Если вы не используете его ни в каком контексте, не имеет значения, что вы используете, но постинкремент используется по соглашению.
Это огромная разница.
Поскольку большинство ответов уже указали на теорию, я хотел бы указать на простой пример:
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);