Я пытаюсь углубиться в пост и pre инкременты, но немного застрял со следующим выражением:
public static void main(String[] args) {
int i = 0;
i = i+=(++i + (i+=2 + --i) - ++i);
// i = 0 + (++i + (i+=2 + --i) - ++i);
// i = 0 + (1 + (3 + 2) - 1);
// i = 0 + (6 - 1);
System.out.println(i); // Prints 0 instead of 5
}
Я знаю, что я пропускаю логику где-то, но где?
Что я пробовал:
- Переход слева направо (хотя я знаю, что это не рекомендуется)
- Переход от самой неотложной скобки и оттуда.
Спасибо за помощь
PS: Комментарии - это детали моего исчисления
РЕДАКТИРОВАТЬ 1
Я попытался изменить твердое кодированное значение из выражения из 2
на что-то другое, и результат всегда дает 0
Посмотрите на этот пример:
int i = 0;
i = i+=(++i + (i+=32500 + --i) - ++i);
System.out.println(i); // Prints 0
Это выражение должно логически быть нигде рядом с 0
, но каким-то образом оно печатает его.
То же самое происходит, когда я использую отрицательный результат:
int i = 0;
i = i+=(++i + (i+=(-32650) + --i) - ++i);
System.out.println(i); // Prints 0
РЕДАКТИРОВАТЬ 2
Теперь я изменил значение i
, чтобы начать с:
int i = 1;
i = i+=(++i + (i+=2 + --i) - ++i);
System.out.println(i); // Prints 2
i = 2;
i = i+=(++i + (i+=10000 + --i) - ++i);
System.out.println(i); // Prints 4
i = 3;
i = i+=(++i + (i+=(-32650) + --i) - ++i);
System.out.println(i); // Prints 6
Он каждый раз дает двойное значение i
, независимо от того, какое значение имеет жесткое кодирование.