我有这样的代码
#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,这是对的。但是对于第二个,我得到 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])); 答案仍然是错误的。
但是如果我用 g++ 而不是 gcc 编译代码,我可以得到正确的答案: 3, 49, 27, 519 3, 519, 27, 49 如果语句是
int a = 49;
int b = 519;
a ^= b ^= a ^= b;
它可以交换价值。我不知道为什么数组的元素是错误的。