Java の演算子の優先順位について 2 つの同様の質問があります。
最初の1つ:
int X = 10;
System.out.println(X++ * ++X * X++); //it prints 1440
Oracle のチュートリアルによると:
後置 (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 の順序付けを無視して、それらを 1 つのレベルに置いているようです。したがって、実際の順序は次のとおりです。
X++ -> ++X -> X++
答えが (10 * 12 * 12) = 1440 になる理由.
二つ目:
int a=1, b=2;
a = b + a++;
受け入れられた回答の一部:「割り当ての時点までに、(優先順位のために) to++
の値が既にインクリメントされているため、そのインクリメントされた値を上書きします。」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
そして、私は考えます:OK、a = 2+3
そうa
あるべきです5
。しかし、答えはただ4
私は本当に混乱しています。私はすでに数時間を費やしましたが、どこが間違っているのかまだ理解できません。
PS私は、この「スタイル」を実際のアプリケーションで使用すべきではないことを知っています。自分の考えの何が間違っているのかを理解したいだけです。