Разница между ++Var и var++ [дубликат]

этот вопрос уже есть ответ здесь:

в программировании, особенно на Java, в чем разница между:

int var = 0;
var++;

и

int var = 0;
++var;

какие последствия это будет иметь для для петли?

например

for (int i = 0; i < 10; i++) {}

for (int i = 0; i < 10; ++i) {}

8 ответов


tldr;

хотя и var++ и ++var увеличьте переменную, к которой они применяются, результат, возвращаемый var++ - это значение переменной перед увеличением, тогда как результат возвращается ++var значение переменной после применения инкремента.

Дальнейших Объяснений

, когда ++var или var++ сформировать полное утверждение (как в ваших примерах) нет никакой разницы между ними. Например после

int x = 6;
++x;
assert x == 7;

идентичен

int x = 6;
x++;
assert x == 7;

однако, когда ++var или var++ используются как часть более крупного оператора, два не могут быть эквивалентны. Например, следующее утверждение проходит

int x = 6;
assert ++x == 7;

тогда как этот терпит неудачу

int x = 6;
assert x++ == 7;

хотя и var++ и ++var увеличьте переменную, к которой они применяются, результат, возвращаемый var++ - значение переменной перед увеличением, тогда как результат, возвращенный ++var значение переменной после применения инкремента.

при использовании for цикл, нет никакой разницы между ними, потому что приращение переменной не является частью большего оператора. Он может не отображаться таким образом, потому что в той же строке исходного файла есть другой код. Но если вы посмотрите внимательно, вы увидите, что есть ; непосредственно перед приращением и ничего после этого, поэтому приращение оператор не является частью большего оператора.


++var - это пре-инкремент оператор; это увеличивает значение var до оценки выражения. Аналогично,var++ является оператором post-increment; он увеличивает значение var после оценки выражения.

в случае простого цикла нет разницы между двумя, потому что выражения ++var; и var++; оба дают один и тот же результат.

для получения дополнительной информации, см., например, http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#IncDecOps.


int a = 5, b;

post increment : b = a++; : a это b а то a увеличивается, так что теперь b is 5 и a и 6 эффект b = a; a = a + 1;

pre increment: b = ++a; : во-первых a увеличивается, а затем переведен в b, Теперь a и 7 и b is 7. Эффект a = a + 1; b = a

a++ и ++a оставаясь самостоятельно действовать аналогичным образом. В представленных примерах цикла операторы приращения не связаны ни с одним выражением и являются независимыми. Поэтому эти два в данной конкретной реализации идентичны.


в ваших примерах, нет никакой разницы, есть же разница между:

int var = 0;
int var2 = ++var;

и:

int var = 0;
int var2 = var++;

в первом случае значение var2 равно 1, а во втором-0.


var++ возвращает свое значение перед увеличением.
++var возвращает свое значение после увеличения.

int var = 0;
System.out.println(var++); // returns 0;

var = 0;
System.out.println(++var); // returns 1

++i является преинкрементом, это делается до того, как что-либо в выражении появляется.

i++ - это postdecrement, это делается после того, как что-либо в выражении появляется.

в первом цикле, вы будете работать от 0 до 9. Во втором, он будет работать от 1 до 9.

мой совет: избегайте обоих из них (исключения могут быть i++; или первый цикл). Слишком сложно искать выражение лица.

Я прошел долгий день отладки

myArray [(i++)%16] = data

и пытаясь найти, почему он пытался писать данные[16] иногда


на самом деле, это довольно просто. Preincrement ++i выполняется первым в инструкции.

j = ++i +1;

эквивалентно

i = i+1;
j = i+1;

тогда как post increment i++ выполняется в конце;

j = i++ +1;

эквивалентно

j = i+1;
i = i+1;

и ++var и var++ идентичны, когда появляются только в выражении. Это относится к вашему вопросу, потому что у вас есть только ++i, i++

это разница происходит только тогда, когда вы вставляете их:

int x = 0;
printf( "%d %d\n", ++x, x ); // 1 1
printf( "%d %d\n", x++, x ); // 1 2

Как запомнить?

когда вы видите сначала оператор, затем increment и позже взять значение.

когда вы видите сначала переменная, затем принять значение и позже прирост.

так, в первом примере вы видите равные значения, потому что:

you increment `x`, then access `x`, then access `x` again  

Итак, во втором примере вы видите различия, потому что:

you access `x`, then increment `x`, then access `x` again