Разница в поведении обусловлена поведением двух разных операторов, которые вы используете. ++
перед переменной является оператором префикса и ++
после того, как переменная является оператором постфикса. Два разных оператора изменяют переменную в два разных раза во время оценки выражения. Смотрите эту StackOverflow What is the difference between prefix and postfix operators?
Когда вы делаете назначение, операции на правой стороне оператора присваивания (знак равенства или =
) оцениваются и результат помещается в переменную слева от оператора присваивания.
Операции с правой стороны оцениваются или вычисляются с использованием различных правил приоритета оператора. См. Этот stackoverflow Operator precedence in Java.
Итак, вопрос заключается в оценке правой стороны, что является результатом различных операций, которые находятся в правой части оператора присваивания.
Оба префикса и постфиксные операторы имеют почти самый высокий приоритет оператора в Java, а также большинство языков. Это означает, что, если скобки не используются для изменения последовательности оценки, операторы префикса и постфикса будут одним из первых оцениваемых операторов. См. Java Operator Precedence Table для краткой и простой таблицы чит-листа.
Оператор префикса модифицирует переменную, а затем новое значение переменной используется в любых дополнительных операциях. Постфикс-оператор изменяет переменную после того, как текущее значение переменной сохраняется как временное значение.
Другими словами, значение переменной, используемой в выражении, будет измененным значением с префиксом и неизменным значением с помощью постфиксного оператора.
Это легче увидеть, что происходит с помощью двух переменных, а не один:
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
от оператора postfix или новое значение a
от префиксного оператора не используются ни для чего. Единственным результатом использования этих операторов является то, что переменная a
увеличивается.
Другими словами, если используется префикс или постфиксный оператор, на самом деле есть два результата или результаты от оператора. Первый результат - изменение переменной, которая изменяется оператором, также известный как побочный эффект. Второй результат - это значение, которое предоставляется любым другим операторам, которые могут участвовать в вычислении. В случае префиксного оператора этот второй результат - новое значение переменной после применения префиксного оператора. В случае постфиксного оператора этот второй результат - это старое значение переменной до применения оператора postfix.
В частности, этот [ответ] (http://stackoverflow.com/a/12111301/794242) объяснит детали –
@WandMaker нет, это не так. в этих ответах есть две разные переменные, которые назначаются друг другу, а здесь «step = step ++» будет равен 0. На основании ответов в этом вопросе это будет другим. но это не так. Зачем? – lonesome
Перечитайте внимательно объяснение, в котором байт-код (и, следовательно, в псевдо-Java-коде) y = y ++ будет переведен в. Поэтому у вас есть порядок инструкций и четкое объяснение полученных результатов. – benzonico