Java: precedências do operador pre-, postfix
Eu tenho duas perguntas semelhantes sobre as precedências do operador em Java.
Primeiro:
int X = 10;
System.out.println(X++ * ++X * X++); //it prints 1440
De acordo comTutorial do Oracle:
Os operadores postfix (expr ++, expr--) têm precedência mais alta que o prefixo (++ expr, --expr)
Então, suponho que a ordem de avaliação:
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.
Mas Java parece ignorar a ordenação PRE / POST e coloca-os em um nível. Então a ordem real:
X++ -> ++X -> X++
o que faz com que a resposta seja (10 * 12 * 12) = 1440.
O segundo:
int a=1, b=2;
a = b + a++;
Parte da resposta aceita: "No momento da atribuição,++
já incrementou o valor dea
para2
(por causa da precedência), então=
sobrescreve esse valor incrementado ".
OK, vamos ver o passo a passo:
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
Parece que tudo está bem. Mas vamos fazer uma pequena mudança nesse código (substitua "=" por "+ =")
a += b + a++;
os passos 1-4 devem ser os mesmos que acima. então, após o passo 4, temos algo assim:
a += 3;
Ondea==2
E então eu penso: OK,a = 2+3
, assima
deveria estar5
. MAS a resposta é apenas4
Estou realmente confuso. Já passei algumas horas, mas ainda não consigo entender onde estou errado.
P.S. Eu sei que não devo usar esse "estilo" em aplicações reais. Eu só quero entender o que está errado em meus pensamentos.