Почему оценка Java-операторов происходит именно так?


int z = 1;
System.out.println(z++ == ++z);
System.out.println(++z == z++);

Выход будет:

false
true
И я не понимаю, почему, пожалуйста, объясните мне это.
6 2

6 ответов:

Во-Первых, Вы Должны Очистить О Pre Increment & Post Increment Давайте Посмотрим

int i=1;
int j=i++;
int k=++i;

Здесь в значении j будет 1 и k будет 3

Почему означает в i++ сначала хранить значение i в j и после чего приращивает значение i so

j=1,i=2 ok :)

Теперь в случае ++i , где сначала увеличивают значение и после этого сохраняют в k so

k=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);

Что является истинным.