私はこのようなコードを持っています
#include <stdio.h>
int main()
{
int A[4] = {3, 519, 27, 49};
(A[1]) ^= (A[3]);
(A[3]) ^= (A[1]);
(A[1]) ^= (A[3]);
printf("%d, %d, %d, %d\n", A[0], A[1], A[2], A[3]);
A[1] ^= A[3] ^= A[1] ^= A[3];
printf("%d, %d, %d, %d\n", A[0], A[1], A[2], A[3]);
}
A[1] と A[3] の値を交換したい。最初の printf では、3、49、27、519 という答えが得られました。これは正しいです。しかし、2 番目については、3、0、27、49 を取得します。「A[1] ^= A[3] ^= A[1] ^= A[3];」というステートメントだと思います。に翻訳されています:
A[1] = A[1] ^ A[3];
A[3] = A[3] ^ A[1] ^ A[3];
A[1] = A[1] ^ A[3] ^ A[1] ^ A[3];
これらの式を計算すると、A[1] は常に 519 になり、A[3] は 49 になります。gdb でデバッグすると、このステートメントで A[1] が最初に 49 -> 566 に変更され、次に A[3] が 519 から 49 に変更され、次に A[1] が 566 から 0 に変更されることがわかります。
また、次のように宣言を変更しようとしました: volatile int A[4] = {3, 519, 27, 49}; しかし、出力はまだすべて同じです。次のようにステートメントを変更します。 A[1] ^= (A[3] ^= (A[1] ^= A[3])); 答えはまだ間違っています。
しかし、gcc の代わりに g++ を使用してコードをコンパイルすると、正しい答えを得ることができます: 3, 49, 27, 519 3, 519, 27, 49 ステートメントが
int a = 49;
int b = 519;
a ^= b ^= a ^= b;
価値を交換することができます。なぜ配列の要素が間違っているのかわかりません。