2016-10-27 21 views
0

私はJavaで「TEMPのないJavaでスワップ変数」を試してみましたし、私は私を気に何かが見つかりました:私は個人として左端の割り当てを分離した場合、出力はしかし一時的なスワップはJavaでは動作しませんか?

2 vs 0 


を示し

int a = 1, b = 2; 
b^= a ^= b ^= a; 
System.out.println(a + " vs " + b); 

を声明:

int a = 1, b = 2; 
a ^= b ^= a; 
System.out.println(a + " vs " + b); 
b^=a; 
System.out.println(a + " vs " + b); 

出力は

です
2 vs 3 
2 vs 1 

出力が期待通りです。
C++では、右から左への評価が保証されています。言語仕様の点で、Javaがそのような期待された結果を導くことができるとの違いは何ですか?

答えて

3

JLSによると、x ^= yx = (x)^(y)に相当します(そこにはキャストもありますが、intを扱っている場合はキャストは関係ありません)。だから、この:

b ^= a ^= b ^= a; 

Javaでは

b = (b)^(a = (a)^(b = (b)^(a))); 
//  ^^^ 

に相当し、オペレータへの引数は、常に左から右に評価されています。したがって、私が上で指摘したbは、式の右側の部分にbに割り当てられる前に評価されているので、オリジナルのの値はbです。それは第三文が^に左のオペランドとしてb新しい値を使用するための式は

b ^= a; 
a ^= b; 
b ^= a; 

に相当ないであることを意味します。

関連する問題