Почему оценка Java-операторов происходит именно так?
int z = 1;
System.out.println(z++ == ++z);
System.out.println(++z == z++);
Выход будет:
false
true
И я не понимаю, почему, пожалуйста, объясните мне это.6 ответов:
Во-Первых, Вы Должны Очистить О Pre Increment & Post Increment Давайте Посмотрим
int i=1; int j=i++; int k=++i;Здесь в значении
jбудет1иkбудет3Почему означает в
i++сначала хранить значениеiвjи после чего приращивает значениеisoj=1,i=2 ok :)Теперь в случае
++i, где сначала увеличивают значение и после этого сохраняют вksok=3,i=3 ok :)Теперь я перехожу к вашему вопросу
int z = 1; System.out.println(z++ == ++z);Так скажи мне, что будет быть
z++? 1 ОК:) следовательно,++zбудет ?3Итак, оператор выведетfalseok :) и второй случайSystem.out.println(++z == z++);
++zбудет4иz++будет4так что вы получилиtrueТак что, надеюсь, вам все ясно...
Операнды
==вычисляются слева направо , а++имеет более высокий приоритет, поэтому ваш код эквивалентен:int z = 1; int tmp1 = z++; //tmp1 = 1 / z = 2 int tmp2 = ++z; //tmp2 = 3 / z = 3 System.out.println(tmp1 == tmp2); tmp1 = ++z; //tmp1 = 4 / z = 4 tmp2 = z++; //tmp2 = 4 / z = 5 System.out.println(tmp1 == tmp2);Я предполагаю, что вы понимаете разницу между
z++и++z:
tmp1 = z++;можно разбить на:tmp1 = z; z = z + 1;- тогда как
tmp2 = ++z;можно разбить на:z = z + 1; tmp2 = z;
int z = 1; System.out.println(z++ == ++z); System.out.println(++z == z++);Z++ - это постинкремент, а ++z-прединкремент. Post increment увеличивает значение после вычисления выражения, а pre increment увеличивает значение перед вычислением выражения.
Следовательно,
int z = 1; System.out.println(z++ == ++z); // 1 == 3 false System.out.println(++z == z++);// 4 == 4 true
Оператор
==отдает приоритет тому, что находится слева от него, другими словами, поскольку он оперирует 2 значениями, значения слева вычисляются первыми.Оператор
++перед меткой var указывает, что приращение присваивается значению до его вычисления, тот же оператор, помещенный после метки, вызывает постинкремент, то есть значение переменной увеличивается на 1 после ее вычисления.Относительно второго ряда вашего код:
- оператор
==смотрит налево- оператор вычисляет
zкак1- оператор сделал с левой частью, но инкремент сделан из-за вашего
z++, который просто говорит, что инкремент послеzвычисляется, так что теперьzявляется2, но оценивается оператором==как1, помните это.- оператор
==смотрит направо- оператор не может оценить то, что находится в
z, не делая приращения из-за++zэто означает, чтоzоценивается как31 != 3.
Те же понятия применимы и к следующей строке.
System.out.println(z++ == ++z); // 1 == 3 is false System.out.println(++z == z++); // 4 == 4 is trueПри использовании Post-значение приращения копируется во временную переменную 'ТМП', проверьте здесь постинкремент. Таким образом,
z++ == ++z=> принимает значение1 == 3, которое является ложным. Теперь z - это 3.Переходя ко 2-му выражению:
++z == z++, снова: ++z становится 4, и в случае z++ значение копируется в переменнуюtmpи используется вz++. Выражение становится4 == 4, которое является истинным и конечным значениемz is 5
Оператор ++z возвращает инкрементированное значение z, тогда как z++ возвращает свое предыдущее значение до инкремента, однако значение z После того, как выражение Z++ возвращает инкрементированное значение z.
Итак
int z = 1; // Line 1 System.out.println(z++ == ++z); // Line 2 System.out.println(++z == z++); // Line 3В строке 2 z++ возвращает 1, и значение z увеличивается, как только оно возвращает so z теперь 2, а ++z увеличивает значение перед возвращением so z равно 3. Поэтому строка 2 является
System.out.println(1 == 3);Который является ложным.
В строке 3, ++z принимает значение 4 (так как предыдущее значение z равно 3) и z++ снова возвращает Предыдущее значение z, т. е. 4, но теперь z равно 5. Поэтому строка 3 является
System.out.println(4 == 4);Что является истинным.