Почему оценка 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
и после чего приращивает значениеi
soj=1,i=2 ok :)
Теперь в случае
++i
, где сначала увеличивают значение и после этого сохраняют вk
sok=3,i=3 ok :)
Теперь я перехожу к вашему вопросу
int z = 1; System.out.println(z++ == ++z);
Так скажи мне, что будет быть
z++
? 1 ОК:) следовательно,++z
будет ?3
Итак, оператор выведетfalse
ok :) и второй случай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
оценивается как3
1 != 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);
Что является истинным.