2016-09-22 3 views
3

私のコードは次のとおりJavaでこの数式を評価したところ、私はどこで悩んでいますか?

int x=5,y=3; 
x+=y*++x-x/y-y++; 
System.out.println("Value = "+x); 

私の評価は以下の通りである:

X + = Y * ++ XX/
++のY-Y(X = 5 | Y = 3)

x = x +(y * ++ xx/y-y ++)
(x = 5 | y = 3)| ++と - 最高の優先度を持っています。

x = x +(y * 6-x/y-3)
(x = 6 | y = 4)| *および/持ち次に高い優先

X = X +(4 * 6-(6/4)-3)
(X = 6 | Y = 4)

X = X +(24 -1 - 3)
(X = 6 | Y = 4)

X = 6 + 20
(X = 6 | Y = 4)

ただし、X = 26

、場合私はthを評価する上記のJavaの場合、出力は18になります。何が間違っていましたか?

また、上記のような問題を段階的に分析できるオンラインのプログラムはありますか?もしそうなら、名前をつけることができますか?

+4

表現。あなたも同様にそれらを避ける場合は、より良い開発者になるでしょう。そして、私たちはあなたを罰するためにあなたを追跡する必要はありません:-) – paxdiablo

+0

@paxdiablo私の生徒のための学校の宿題でした..: '( –

+1

あなたがした間違いは、式の間にポストインクリメントを実行していたとき、式が計算されるまで残す必要があります – kamoroso94

答えて

6

式が左から右に評価されます。

x += (y*++x)-(x/y) -(y++); 
     3*6 - 6/3 - 3  == 18 - 2 - 3 == 13 

ので

x += 13 == 18 // since the original value of x is used here 

最後の部分についてはそれがcompound assignment operatorsの定義なので、xの元の値が使用されます。

  • まず、変数を生成するために左辺のオペランドが評価されます。この評価が突然完了すると、同じ理由で割り当て式 が突然完了します。右側のオペランドは ではなく、代入は行われません。

  • それ以外の場合は、左側のオペランドの値が保存され、次に右側のオペランドの評価がになります。この評価が を突然終了した場合、同じ理由で の代入式が突然完了し、割り当てが行われません。

  • は、そうでない場合、左側の変数右側のオペランドの値の保存された値は、複合代入演算子によって示されるバイナリ操作 を実行するために使用されます。この操作 が突然完了すると、同じ理由で代入式が突然完了します(代入式は )。

  • は、そうでない場合、バイナリ演算の結果は、適切な標準値のセット(ない 拡張指数に値設定変換 (§5.1.13)に付し、左側の変数の型に変換され値の集合)、変換の結果は が変数に格納されます。 `のx + = Y * ++ X-X/Y-Y ++` *正確に*人々がそれらを避けている理由のような

+1

x = 6の値が残りの式全体で使用されていますが、なぜx = 5の元の値が使用されるのですか? –

+0

も++ x、 - x 、++ yと--yは他のすべての式の前に計算されているはずですが、なぜ私たちはここでそれをしていませんか?Ref:http://www.cs.bilkent.edu.tr/~guvenir/courses/CS101/op_precedence .html –

+0

@SomenathSinha最初のコメントの質問を説明するJLSリファレンスが追加されました。 – Eran

関連する問題