Разница между ++Var и Var++ [дубликат]
этот вопрос уже есть ответ здесь:
- Как работают операторы post increment (i++) и pre increment (++i) в Java? 14 ответов
в программировании, особенно на Java, в чем разница между:
int var = 0;
var++;
и
int var = 0;
++var;
какие последствия это будет иметь для A петля?
например
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++
- это оператор постинкремента; он увеличивает значениеvar
после оценки выражения.в случае простого цикла, нет никакой разницы между двумя, потому что выражения
++var;
иvar++;
оба дают один и тот же результат.для получения дополнительной информации, см., например, http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#IncDecOps.
int a = 5, b;
пост инкремент:
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
++i-это предрождество, это делается до того, как что-либо появится в выражении.
i++ - это postdecrement, это делается после того, как что-либо в выражении появляется.
в первом цикле, вы будете работать от 0 до 9. Во втором, он будет работать от 1 до 9.
мой совет: избегайте обоих из них (исключения могут быть i++; или первый цикл). Слишком сложно искать в выражении лица.
Я прошел долгий день отладки
myArray [(i++)%16] = данные
и пытается найти, почему он пытался писать в data [16] иногда
на самом деле, это довольно просто. Preincrement ++i выполняется первым в инструкции.
j = ++i +1;
эквивалентно
i = i+1; j = i+1;
в то время как пост инкремент 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
Как запомнить?
когда вы видите сначала оператор, затем инкремент и позже взять значение.
когда вы видите сначала переменная, затем принять значение и позже прирост.
так, в первом примере вы видите равные значения, потому что:
you increment `x`, then access `x`, then access `x` again
Итак, во втором примере вы видите различия, потому что:
you access `x`, then increment `x`, then access `x` again