Разница между ++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;