这个技巧总能奏效吗?

0 c c++

可能重复:
"在不使用第三个变量的情况下交换两个变量的值"中的潜在问题

我最近在一个社区中读到,我们可以轻松地交换两个数字而不使用第三个使用XOR技巧.

立方公尺= N ^ =立方公尺= N; 提到了一些技巧.

你们有什么感想?这个技巧总是有用吗?

Eva*_*ran 5

你写它的方式,它是未定义的行为.这是因为您在同一序列点中多次修改变量.但是,如果您重写如下:

m ^= n;
n ^= m;
m ^= n;
Run Code Online (Sandbox Code Playgroud)

那么它是安全的.然而,"有用"是另一个问题,它很少"有用",有时它实际上比实际使用临时更慢!

此外,你需要小心别名(指针/引用),因为如果你试图与自己交换东西,那么你最终会意外地将你的值归零.例如:

#define SWAP(m, n) { m ^= n; n ^= m; m ^= n; }

int x[] = { 1, 2, 3, 4 };
int i = 0;
int j = 0;
SWAP(x[i], x[j]); // whoops, x[0] == 0 now, not 1!
Run Code Online (Sandbox Code Playgroud)

更传统的交换实现没有这个问题.