Предварительная и постинкрементация на Java

Я просто хотел создать небольшую Java-Puzzle, но я озадачил себя. Одна часть головоломки:

Что делает следующий фрагмент кода:

public class test {
    public static void main(String[] args) {
        int i = 1;
        i += ++i + i++ + ++i;

        System.out.println("i = " + i);
    }
}

Он выводит 9.

Мое (по крайней мере частично) неправильное объяснение:

Я не совсем уверен, но я думаю, что термин после i += оценивается следующим образом:

enter image description here

Итак,

int i = 1;
i += ++i + i++ + ++i;

совпадает с

int i = 1;
i += ((++i) + (i++)) + (++i);

Это оценивается слева направо (см. Предварительная и постинкрементная оценка java).

Первый ++i увеличивает i на 2 и возвращает 2. Итак, у вас есть:

i = 2;
i += (2 + (i++)) + (++i);

i++ возвращает 2, так как это новое значение i, и увеличивает i на 3:

i = 3;
i += (2 + 2) + ++i;

Второй ++i увеличивает i до 4 и возвращает 4:

i = 4;
i += (2 + 2) + 4;

Итак, вы получите 12, а не 9.

Где ошибка в моих объяснениях? Что было бы правильным объяснением?

Ответ 1

i += ++i + i++ + ++i; совпадает с i = i + ++i + i++ + ++i;

Правая часть вычисляется слева направо, что дает i = 1 + 2 + 2 + 4; (что дает i = 9).

Ответ 2

Вы правы в отношении оценки правильной части, но вам не хватает деталей относительно назначения.

Запустите это:

i = i++;

или это:

i += i++;

После обеих операций у меня все еще есть исходное значение.

Это потому, что я оценивается слева перед правой частью назначения.

Итак, в вашем случае вы добавляете 8 к 1, а не к 4.

Ответ 3

Вывод 9 (попробуйте)

int i = 1;
i += ++i + i++ + ++i;

становится

i = 1 + 2 + 2 + 4

Ответ 4

очень легко понять, как это работает, если вы представляете, как java хранит значения в регистрах! он помещает 1 в первый регистр, а затем проходит через знак = и увеличивает я (++ i), поэтому теперь в я у вас есть 2, а во втором регистре у вас 2, но первый регистр не обновляется, в третьем регистре у вас будет 2, а затем я будет увеличен, а затем я будет увеличен, а в последнем регистре у вас будет 4. Таким образом, у вас будет что-то вроде этого  1 = 2 + 2 + 4 == 9

Ответ 5

Код

int i = 1;
i += ++i + i++ + ++i

эквивалентно

int tmp1 = i // 1, +=

i ++; // 2
int tmp2 = i; // 2

int tmp3 = i; // 2
i ++; // 3

i ++; // 4
int tmp4 = i; // 4

i = tmp1 + tmp2 + tmp3 + tmp4; // 9

Ответ 6

i += ++i + i++ + ++i;

  • i=1 при запуске
  • i += Xi = i + Xi = 1 + X (так что давайте считать X)
  • ++i будет увеличено до 2 и return 2
  • i++ будет return 2, а затем увеличен до 3
  • ++i будет увеличиваться с 3 до 4 и return 4
  • X = 2 + 2 + 4 = 8

So i = 1 + 8i=9


Вы получите 12, если ваш код будет примерно таким

int i = 1;
int tmp = ++i + i++ + ++i;  
i += tmp;

потому что тогда ваш код будет i=1, а после вычисления tmp я будет i=4, тогда i+=tmpi=4+8=12