8

重複の可能性:
このステートメントがJavaで機能しないのはなぜですかx ^ = y ^ = x ^ = y;

サンプルコード

int a=3;
int b=4;
a^=(b^=(a^=b));

C ++では変数を交換しますが、Javaではa = 0、b = 4になるのはなぜですか?

4

2 に答える 2

17

a^=bスワップをすべて1つのステートメントで記述することにより、外部式に対する内部式の副作用に依存することになりa^=(...)ます。JavaコンパイラとC++コンパイラの動作は異なります。

xorスワップを適切に実行するには、少なくとも2つのステートメントを使用する必要があります。

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

ただし、変数を交換する最良の方法は、一時変数を使用してありふれた方法でそれを行い、コンパイラーに実際にそれを行うための最良の方法を選択させることです。

int t = a;
a = b;
b = t;

最良の場合、コンパイラーは上記のスワップに対してコードをまったくa生成せず、保持しているレジスターの処理を開始するだけでb、その逆も同様です。コードに勝るものがないトリッキーなxorコードを書くことはできません。

于 2010-10-12T08:19:56.873 に答える
7

これはC++でも動作することが保証されていません。これは未定義の動作です。

あなたは3つの別々のステートメントでそれをするべきです:

a ^= b; 
b ^= a;
a ^= b;
于 2010-10-12T08:18:59.073 に答える