2016-08-21 1 views
0
x=10; 
y = --x + x++; 
System.out.println(y); 
// prints 18  

リンクhttps://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.htmlによると、後置インクリメント(x ++)はプリフィックスインクリメント/デクリメント(-x)よりも優先順位が高くなります。java演算子の優先度y = - x + x ++;

x++(値10)は、--x(値11-1 = 10)より前に実行する必要があります。だからy=20。しかし、「y」はどのようにして18になるのですか?

+2

下記参照明らかなように

だから、18は、正しいこともhttp://stackoverflow.com/questions/2371118/how-do-the-post -increment-i-and-pre-increment-i-operators-in-java – Tunaki

+1

このチュートリアルでより高い優先順位が何を意味するのか分かりません。それは確かにここでは関係ありません。 '+'のオペランドは左から右に評価されるので、 ' - x'は' x ++ 'の前に評価されます。 @ Tunakiのリンクは、より詳細には非常に便利です。 –

+0

私が最初に興味を持ったのは、 '++ a'は' ++ a'が値を返すので、 '++ a ++'が正しくないので、 '++ a'の前に' a ++ ' '(++ a)++'や '++(a ++)'としてコンパイルされるかどうかにかかわらず例外を引き起こします。しかし、誤解していないと、 'a +++ b 'の場合は、' a +(++ b) 'ではなく'(a ++)+ b'であると判断すると便利です。 – Pshemo

答えて

3

それはthis link

結合性と優先する順番Javaは部分式に演算子を適用したが、彼らはその中の部分式が評価される順序を決定していないかを決定で説明したように。 Javaでは、部分式は左から右へ評価されます(選択肢がある場合)。したがって、式A() + B() * C(D(), E())のように、部分式は、A(),B(),D(),E()およびC()の順に評価されます。 C()はD()とE()の両方に表示されますが、C()を評価するにはD()E()の両方の結果が必要です。この振る舞いに依存するコードを記述するのは貧弱なスタイルであると考えられています(また、さまざまなプログラミング言語が異なるルールを使用する可能性があります)。

それは二つのサブ式の合計であり、式全体が左から右に評価されるよう

--x 

より
x++ 

前に実行され、評価される理由を説明しています。したがって、最初のものはx++よりも前に実行されます(たとえば、修正後の++の方が一般的に優先されますが、ここではそれを含む部分式は最初のものの後に評価されます)。あなたは9 xに2回を加算しているよう

x=10; 
y = --x + x++; 
// y = (10-1) /* now x==9 */ + (9); /* after this x == 10 */ 
// y = (9) + (9); /* and now x == 10 */ 
// y == 18 and x == 10 
+0

@Pshemo、回答を更新しました – ddb

+0

@ maanick90、私の回答を更新しました – ddb