Разница в поведении связана с поведением двух разных операторов, которые вы используете. ++
перед переменной — это префиксный оператор, а ++
после переменной — постфиксный оператор. Два разных оператора изменяют переменную в два разных момента во время вычисления выражения. См. этот stackoverflow В чем разница между префиксными и постфиксными операторами? < /а>
Когда вы выполняете присваивание, оцениваются операции справа от оператора присваивания (знак равенства или =
), а результат помещается в переменную слева от оператора присваивания.
Операции в правой части оцениваются или вычисляются с использованием различных правил приоритета операций. См. этот stackoverflow Приоритет оператора в Java.
Таким образом, вопрос заключается в том, когда оценивается правая часть, каков результат различных операций, которые находятся в правой части оператора присваивания.
Как префиксные, так и постфиксные операторы имеют почти наивысший приоритет в Java, как и в большинстве языков. Это означает, что если круглые скобки не используются для изменения последовательности вычислений, префиксные и постфиксные операторы будут одними из первых оцениваемых операторов. См. Таблицу приоритета операторов Java, где представлена краткая и простая шпаргалка.
Префиксный оператор изменяет переменную, а затем новое значение переменной используется во всех дополнительных операциях. Постфиксный оператор изменяет переменную после сохранения текущего значения переменной как временного значения.
Другими словами, значение переменной, используемой в выражении, будет измененным значением с префиксным оператором и неизменным значением с постфиксным оператором.
Легче увидеть, что происходит, используя две переменные, а не одну:
int a, b;
a=0;
b = ++a; // increment a and assign the new value of variable a to variable b
b = a++; // increment a and assign the old value of variable a to variable b
Если вы используете единственную переменную, как вы делаете, то происходит то, что значение переменной a
изменяется оператором присваивания, чтобы быть тем, что оценивает правая часть. Таким образом, несмотря на то, что переменная a
изменяется префиксными и постфиксными операторами, присваивание перезапишет новое значение тем, что когда-либо оценивалось в правой части.
С оператором префикса правая часть вычисляет новое увеличенное значение переменной a
. При использовании постфиксного оператора правая часть вычисляет старое значение переменной a
до того, как оно будет увеличено постфиксным оператором.
Часто, когда требуется просто увеличить переменную, в отдельном операторе используется префикс или постфикс ++
.
int a = 0;
a = a + 1; // increment a by adding 1 to the value and assigning new value to a
a += 1; // increment a by using += operator
a++; // increment a by using postfix ++ operator
++a; // increment a by using the prefix ++ operator
В операторах выше, где используется оператор ++
, ничего не делается с результатом операции. Таким образом, переменная a
увеличивается, однако старое значение a
из постфиксного оператора или новое значение a
из префиксного оператора ни для чего не используются. Единственным результатом использования этих операторов является увеличение переменной a
.
Другими словами, когда используется префиксный или постфиксный оператор, на самом деле есть два результата или результата от оператора. Первым результатом является изменение переменной, которую модифицирует оператор, также известное как побочный эффект. Второй результат — это значение, которое предоставляется любым другим операторам, которые могут участвовать в вычислении. В случае префиксного оператора этот второй результат является новым значением переменной после применения префиксного оператора. В случае постфиксного оператора этот второй результат является старым значением переменной до применения постфиксного оператора.
person
Richard Chambers
schedule
22.11.2015
step=step++
приведет к 0. В зависимости от ответов на этот вопрос он будет другим. но это не так. Зачем? - person lonesome   schedule 22.11.2015y
. Следовательно, в конце моего кода то же самое должно произойти сstep
, чего не происходит. - person lonesome   schedule 22.11.2015y = x ++;
— этоint t = x; x++; y = t;
, аstep = step++;
— этоint t = step; step++; step = t;
, поэтому он не должен изменятьstep
, поскольку он перезаписывается, чего не происходит в случаеx
иy
. - person Peter Lawrey   schedule 22.11.2015y
, а добавляет 1 перед присваиванием. - person Peter Lawrey   schedule 22.11.2015++x is called preincrement while x++ is called postincrement.
, поэтому он должен сначала выполнить задание, а затем добавить. точно так же, как все программисты обычно делают в цикле for какi++
. В общем, вы имеете в виду, чтоstep++
даст другой результат? который он сделал, дает те же результаты, что иstep=++step
. теперь я немного запутался. - person lonesome   schedule 22.11.2015step++
не дает другого результата. ноstep=step++;
илиi=i++
будут. - person Peter Lawrey   schedule 22.11.2015step=step++
только сstep++
дает разные результаты, хотя оба используют один и тот же инкрементный операнд. - person lonesome   schedule 23.11.2015