一時変数や xor を使用せずにスワップを作成するように依頼されたので、これを思いつきました。
Java では機能しますが、C/C++ では機能しません。
「|」の左側に「a」の値があるため、これは常に機能するという印象を受けました。レジスタに格納された後、「a」への割り当てが行われ、「b」に割り当てられた値への影響が無効になります。
int a = 5;
int b = -13;
b = a | (0 & (a = b));
変数を変更し、シーケンスポイントを介さずにその値を読み取っています。
b = a + 0 * (a = b);
// reading a's value modifying a
これは未定義の動作です。コードが何をするかについて期待する権利はありません。
C/C++ コンパイラは式0 * (a = b)
を単純0
に最適化し、コード フラグメントを次のように変換します。
int a = 5;
int b = -13;
b = a;
C/C++では代入は式の順番で行われます。Java では、代入は他の式に関係なく最後に行われます。
たとえば、これは C では増加しますが、Java では何もしません。
a = a++;