В программировании, особенно в Java, в чем разница между:
int var = 0;
var++;
и
int var = 0;
++var;
Какие последствия будут иметь в цикле for?
например.
for (int i = 0; i < 10; i++) {}
for (int i = 0; i < 10; ++i) {}
В программировании, особенно в Java, в чем разница между:
int var = 0;
var++;
и
int var = 0;
++var;
Какие последствия будут иметь в цикле for?
например.
for (int i = 0; i < 10; i++) {}
for (int i = 0; i < 10; ++i) {}
Хотя оба 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++
- оператор пост-инкремента; он увеличивает значение 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
есть 5
, а a
- 6
Эффект b = a; a = a + 1;
pre increment: b = ++a;
: сначала a
увеличивается, а затем результат переносится в b
, поэтому теперь a
есть 7
, а также b
есть 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
++ я preincrement, это делается перед чем-либо в выражении, которое оно появляется.
i ++ - это постдекремент, это делается после всего, что есть в выражении.
в первом цикле вы будете работать от 0 до 9. Во втором он будет работать от 1 до 9.
Мой совет: избегайте их обоих (исключения могут быть я ++ или первый цикл). Слишком сложно искать в выражении.
Я прошел долгий день отладки
myArray [(i ++)% 16] = данные
и пытается найти, почему он пытался иногда писать данные [16]
На самом деле это довольно просто. Preincrement ++ я выполняется сначала в инструкции.
j = ++i +1;
эквивалентно
i = i+1;
j = i+1;
тогда как post increment я ++ выполняется в конце;
j = i++ +1;
эквивалентно
j = i+1;
i = i+1;