У меня есть два похожих вопроса о приоритетах операторов в Java.
Первый:
int X = 10;
System.out.println(X++ * ++X * X++); //it prints 1440
Согласно учебник Oracle:
Операторы postfix (expr ++, expr--) имеют более высокий приоритет, чем префикс (++ expr, --expr)
Итак, я полагаю, что порядок оценки:
1) first postfix operator: X++
1.a) X++ "replaced" by 10
1.b) X incremented by one: 10+1=11
At this step it should look like: System.out.println(10 * ++X * X++), X = 11;
2) second POSTfix operator: X++
2.a) X++ "replaced" by 11
2.b) X incremented by one: 11+1=12
At this step it should look like: System.out.println(10 * ++X * 11), X = 12;
3) prefix operator: ++X
3.a) X incremented by one: 12+1=13
3.b) ++X "replaced" by 13
At this step it should look like: System.out.println(10 * 13 * 11), X = 13;
4) evaluating 10*13 = 130, 130*11 = 1430.
Но Java, похоже, игнорирует порядок PRE/POST и помещает их на один уровень. Итак, реальный порядок:
X++ -> ++X -> X++
что заставляет отвечать (10 * 12 * 12) = 1440.
Второй:
int a=1, b=2;
a = b + a++;
Часть принятого ответа:
"К моменту назначения ++
уже увеличил значение a
до 2
(из-за приоритета), поэтому =
перезаписывает это увеличенное значение."
ОК, посмотрим шаг за шагом:
1) replacing "b" with 2
2) replacing "a++" with 1
3) incrementing "a" by 1 -> at this point a==2
4) evaluating 2+1 = 3
5) overwriting incremented value of "a" with 3
Кажется, все в порядке. Но пусть немного изменится в этом коде (замените "=" на "+ =" )
a += b + a++;
шаги 1-4 должны быть такими же, как указано выше. поэтому после шага 4 мы имеем что-то вроде этого:
a += 3;
где a==2
И тогда я думаю: ОК, a = 2+3
, поэтому a
должен быть 5
. НО ответ только 4
Я действительно смущен. Я уже провел пару часов, но до сих пор не могу понять, где я ошибаюсь.
P.S. Я знаю, что я не должен использовать этот "стиль" в реальных приложениях. Я просто хочу понять, что не так в моих мыслях.