4

一時変数や xor を使用せずにスワップを作成するように依頼されたので、これを思いつきました。
Java では機能しますが、C/C++ では機能しません。

「|」の左側に「a」の値があるため、これは常に機能するという印象を受けました。レジスタに格納された後、「a」への割り当てが行われ、「b」に割り当てられた値への影響が無効になります。

int a = 5;
int b = -13;
b = a | (0 & (a = b));
4

3 に答える 3

10

変数を変更し、シーケンスポイントを介さずにその値を読み取っています。

b =         a          + 0 *   (a = b);
//  reading a's value        modifying a

これは未定義の動作です。コードが何をするかについて期待する権利はありません。

于 2012-06-20T15:12:01.497 に答える
2

C/C++ コンパイラは式0 * (a = b)を単純0に最適化し、コード フラグメントを次のように変換します。

int a = 5;
int b = -13;
b = a;
于 2012-06-20T15:05:10.110 に答える
1

C/C++では代入は式の順番で行われます。Java では、代入は他の式に関係なく最後に行われます。

たとえば、これは C では増加しますが、Java では何もしません。

a = a++;
于 2012-06-20T15:14:40.977 に答える