你写它的方式,它是未定义的行为.这是因为您在同一序列点中多次修改变量.但是,如果您重写如下:
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)
更传统的交换实现没有这个问题.