Java: precedensy operatora poprzedzające poprawkę
Mam dwa podobne pytania dotyczące pierwszeństwa operatorów w Javie.
Pierwszy:
int X = 10;
System.out.println(X++ * ++X * X++); //it prints 1440
WedługSamouczek Oracle:
postfix (expr ++, expr--) operatory mają wyższy priorytet niż prefiks (++ expr, --expr)
Przypuszczam więc, że kolejność oceny:
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.
Ale Java wydaje się ignorować porządkowanie PRE / POST i umieszcza je na jednym poziomie. Więc prawdziwy porządek:
X++ -> ++X -> X++
co powoduje odpowiedź (10 * 12 * 12) = 1440.
Drugi:
int a=1, b=2;
a = b + a++;
Część zaakceptowanej odpowiedzi: „Do czasu przydzielenia,++
już zwiększył wartośća
do2
(z powodu pierwszeństwa), tak=
nadpisuje tę zwiększoną wartość. ”
OK, spójrzmy krok po kroku:
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
Wydaje się, że wszystko jest w porządku. Ale dokonajmy niewielkiej zmiany w tym kodzie (zamień „=” na „+ =”)
a += b + a++;
kroki 1-4 powinny być takie same jak powyżej. więc po kroku 4 mamy coś takiego:
a += 3;
gdziea==2
I wtedy myślę: OK,a = 2+3
, więca
powinno być5
. ALE odpowiedź jest tylko4
Jestem bardzo zmieszany. Spędziłem już kilka godzin, ale wciąż nie rozumiem, gdzie się mylę.
P.S. Wiem, że nie powinienem używać tego „stylu” w prawdziwych aplikacjach. Chcę tylko zrozumieć, co jest nie tak w moich myślach.