サンプルコード
int a=3;
int b=4;
a^=(b^=(a^=b));
C ++では変数を交換しますが、Javaではa = 0、b = 4になるのはなぜですか?
a^=bスワップをすべて1つのステートメントで記述することにより、外部式に対する内部式の副作用に依存することになりa^=(...)ます。JavaコンパイラとC++コンパイラの動作は異なります。
xorスワップを適切に実行するには、少なくとも2つのステートメントを使用する必要があります。
a ^= b;
a ^= (b ^= a);
ただし、変数を交換する最良の方法は、一時変数を使用してありふれた方法でそれを行い、コンパイラーに実際にそれを行うための最良の方法を選択させることです。
int t = a;
a = b;
b = t;
最良の場合、コンパイラーは上記のスワップに対してコードをまったくa生成せず、保持しているレジスターの処理を開始するだけでb、その逆も同様です。コードに勝るものがないトリッキーなxorコードを書くことはできません。
これはC++でも動作することが保証されていません。これは未定義の動作です。
あなたは3つの別々のステートメントでそれをするべきです:
a ^= b;
b ^= a;
a ^= b;