Разница между ++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 Цикл, нет разницы между этими двумя, потому что приращение переменной не является частью более крупного оператора. Это может выглядеть не так, потому что в той же строке исходного файла есть другой код. Но если вы посмотрите внимательно, вы увидите, что есть ; непосредственно перед приращением и ничего после него, поэтому оператор приращения не является частью более крупного оператора.

int a = 5, b;

пост приращения: b = a++;: a сначала передается b а потом a увеличивается, так что теперь b является 5, а также a является 6 Эффект b = a; a = a + 1;

предварительное увеличение: b = ++a;: первый a увеличивается, а затем результат переносится в b, а сейчас a является 7 а также b является 7, Эффект a = a + 1; b = a

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

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

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

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

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

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

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

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

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

а также:

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

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

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

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

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

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

Когда вы видите сначала оператор, затем увеличиваете, а затем принимаете значение.

Когда вы видите сначала переменную, затем принимайте значение, а затем увеличивайте.

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

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

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

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

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

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

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

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

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

myArray[(i++)%16] = данные

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

На самом деле это довольно просто. Преинкремент ++i выполняется первым в операторе.

j = ++i +1;

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

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

тогда как постинкремент i++ выполняется в конце;

j = i++ +1;

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

j = i+1;
i = i+1;
Другие вопросы по тегам