Ответ 1
i += ++i + i++ + ++i;
совпадает с i = i + ++i + i++ + ++i;
Правая часть вычисляется слева направо, что дает i = 1 + 2 + 2 + 4;
(что дает i = 9
).
Я просто хотел создать небольшую 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 +=
оценивается следующим образом:
Итак,
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
.
Где ошибка в моих объяснениях? Что было бы правильным объяснением?
i += ++i + i++ + ++i;
совпадает с i = i + ++i + i++ + ++i;
Правая часть вычисляется слева направо, что дает i = 1 + 2 + 2 + 4;
(что дает i = 9
).
Вы правы в отношении оценки правильной части, но вам не хватает деталей относительно назначения.
Запустите это:
i = i++;
или это:
i += i++;
После обеих операций у меня все еще есть исходное значение.
Это потому, что я оценивается слева перед правой частью назначения.
Итак, в вашем случае вы добавляете 8 к 1, а не к 4.
Вывод 9 (попробуйте)
int i = 1;
i += ++i + i++ + ++i;
становится
i = 1 + 2 + 2 + 4
очень легко понять, как это работает, если вы представляете, как java хранит значения в регистрах! он помещает 1 в первый регистр, а затем проходит через знак = и увеличивает я (++ i), поэтому теперь в я у вас есть 2, а во втором регистре у вас 2, но первый регистр не обновляется, в третьем регистре у вас будет 2, а затем я будет увеличен, а затем я будет увеличен, а в последнем регистре у вас будет 4. Таким образом, у вас будет что-то вроде этого 1 = 2 + 2 + 4 == 9
Код
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
i += ++i + i++ + ++i
;
i=1
при запускеi += X
→ i = i + X
→ i = 1 + X
(так что давайте считать X)++i
будет увеличено до 2 и return 2
i++
будет return 2
, а затем увеличен до 3++i
будет увеличиваться с 3 до 4 и return 4
X = 2 + 2 + 4 = 8
So i = 1 + 8
→ i=9
Вы получите 12, если ваш код будет примерно таким
int i = 1;
int tmp = ++i + i++ + ++i;
i += tmp;
потому что тогда ваш код будет i=1
, а после вычисления tmp я будет i=4
, тогда i+=tmp
→ i=4+8=12