2012-02-13 18 views
0

次の2つの方法で同じ文を書くことができます。私は次のようにxの値に対して2つの出力を提供することで質問をします。代入演算子(Java)

int x = 10; 
x = x*2+5; // Here the value of x is 25. 

x = 10; 
x *= 2+5; // Here the value of x is 70. 

なお、第1 statemnt xは第2 statemnt 5. 2を追加し2で乗算さで 1が一緒になって2〜5を追加し、Xを乗じ、ためであることは明らかです。 しかし、なぜこのように動作していますか?

+1

[* JLS§15.26代入演算子*](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.26) – trashgod

答えて

3

参照:Operator precedence in Java*+よりも厳密に結びついており、両方とも=または*=よりも厳しいものです。ケース2 について

+0

+1は、「どちらも=または* =よりも厳しい」を示します。 – namalfernandolk

5

オペレータが適用される前に、オペレータのすべてのオペランドが完全に評価され、右precedence.Java保証への最初の場合、通常の左にあることをしながら、あなたの秒のステートメントはx = x * (2+5);

x = 10; 
x *= 2+5; 
x = x * (2+5); 

として評価されますので。

複合代入演算子は、以下の構文を有する:

<variable> <op>= <expression> 

、以下のセマンティクス:

<variable> = (<type>) (<variable> <op> (<expression>)) 

「変数」のタイプは、「タイプ」で、「変数」であります一度だけ評価される。セマンティクスにキャストと括弧が暗示されていることに注意してください。ここでは、 "op"は複合代入演算子(*、%、/ etc)のどれでもかまいません。複合代入演算子はJavaのすべての演算子の中で最も優先度が低く、代入の前に右辺の式を評価することができます。

+0

も参照してください。上記のように、これは明らかです。1.最初のstatemnt xに2を掛けて5を加えます。2. 2番目のstatemntに5と2を加えてxを掛けます。それはこれのように振る舞う?これの背後にあるルールは何ですか? – namalfernandolk

+0

これは、右のhステートメントの側は常に最初に実行されます –

+0

@NamalFernando:あなたの質問に対するtrashgodのコメントを参照してください。それがオペレータの定義方法です。 (これはCで動作する方法で、ほとんどの言語がこの演算子を借用しています) – casablanca

0
int x = 10; 
x = x*2+5; 



* has more precedence than + . So 10 * 2 + 5 = 25 


x = 10; 
x *= 2+5; 



+ have more precedence than *=. So the result is 70 

演算子 '=' はプライオリ最も低いので(オペレータが= '+' よりも最も低いプライオリを有するため)評価 '* =' 2 + 5評価オペレータのオペランドを有します。 その時だけオペレータ ''がシーンに入ります。したがって、10 * 7はXに割り当てられます

1

最初のステートメントでは、x = x * 2 + 5となります。 あなた秒のステートメントは、X = X *(2 + 5)のように評価されるためので、それは

x=10*2 
x=20+5; 

ようevaulates。あなたはそれがbracket.So openinngブラケットを持って見ることができますあなたの番目のステートメントで

(higer優先順位は、それが第1ブラケットデータを計算し、それがXに掛ける。だから*に比較しました。

X=x*(2+5) 
x=10*7; 
0

これは、 combining an arithmetic operator with the simple assignment operator to create compound assignmentsの例単純な代入演算子を使用すると、オペレータの右側の値が計算され、その左側のオペランドに割り当て例:。

int x = 2 + 5; 

は明らか7のxための値を与えます。

化合物代入演算子は、同じ基本的な考え方に従います。演算子の右側の値が計算され、複合代入演算子によって変更されます(この場合は、既存の値xに最終計算値7を掛けて割り当てられます)。