編集:私は他の人が完全に回答したことを理解していませんが、これは私の最高の推測です。誰かがこの推測を訂正したい場合は、そうしてください。
私の最高の推測:
+
/ \
a *
/\
b c
今: a + b * c
、a、b及びcは変数ですが、最も優先順位の低いオペレータは、ツリーの最上部にある式ツリー、としていますこのツリーは次のように評価されます。+演算子が評価されます。これを行うために、(再帰的に)左のサブツリーと右のサブツリーを評価し、これらの値を加算します。フルで
が、これは何が起こるかです:それはa
++との表現で、その後a + (b * c)
、それから、それから、それから、最初のb * c
c
b
その評価を終了する理由
- addition operator gets evaluated.
it says "evaluate my left subtree, then my right subtree,
then add them together. i return that value"
- left subtree: is a. evaluate variable a into a value.
(that is, get the value of variable a.)
- right subtree: i'm a multiplication operator. to evaluate me,
evaluate my left subtree, then my right subtree, the nmultiply
them togeter. i return that value.
- left subtree: is variable b. evalute that.
- right subtree: is variable c. evaluate that.
これは私物事、同じことが起こる。例えば、++i + i++
で、式ツリーは次のようになります。
+
/\
preinc postinc
| |
i i
どこpreincは、前置インクリメント演算子を意味します(と前置インクリメント演算子は正確に一つのオペランドを取ります:変数)を(例えば)。ここでの違いは、preincをルートとして持つサブツリーを評価する必要がある場合、「preinc演算子ツリーを評価する」とは、「オペランドの変数を変数の値に置き換える」という意味ではないということです例えば、2 + i)の代わりに、 "変数iの値をインクリメントし、次にpreinc(i)の値は変数iの新しい値です"を意味します。
同様の方法で、代入演算子=は、2 + iと少し異なります。
int j;
j = 3;
ここで式ツリーは
=
/\
j 3
であり、そのルートとして代入演算子を含むツリーが評価を取得する必要がある場合、これは「左手演算子は変数でなければならないことを意味する - ではない値!そして、正しいサブツリーを評価する(それを値に評価することが期待される)。そして、その値を右側のサブツリーの変数に入れる。=(j、3)によって返される値は、右側のサブツリーの値 "となります。
この推測では、評価オーダーのJava言語仕様(リンク:https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.7)の例題の回答を正しく思い付くことができます。
例:
int i = 2;
int j = (i = 3) * i;
System.out.println(j);
例:私は式ツリーを描く場合は、次の2つの例は、私が解けるあり、ある
i`がインクリメントされ
int b = 9;
b = b + (b = 3);
System.out.println(b);
'ので** **その行の後。 「i」も「2」である。そして、「j」は「1 + 1」である。 –
優先順位は、引数のグループ化のみを制御します。評価順序には影響しません。 – user2357112
@ user2357112 oh!私はこれが実際に何を優先するのか分からなかった。その小さなアイデアに感謝します。 – silph