通过 xor 运算符使用引用或指针交换两个变量的值

Interchanging values of two variables by xor operator using references or pointers

本文关键字:两个 变量 交换 运算符 xor 引用 指针 通过      更新时间:2023-10-16

我有两个整数变量i和j,我想创建一个函数,它将这两个变量作为参数并使用xor运算符交换它们的内容。现在,如果我使函数按值获取参数,即void swap (int x , int y);(函数体与下面的函数swap相同),那么值在函数内很好地交换。但是由于我想要的是交换调用函数中变量的值,我使用通过引用(以及指针)传递参数:

void swap ( int& x , int& y )
{
    x^=y^=x^=y;
    cout << x<< " " << y << endl ;
}
int main ()
{
    int i (1), j (2) ;
    swap ( i, j ) ;
    cout << i << " " << j << endl ;
}

但这两种情况都没有显示出正确的结果!

为什么 swap 函数不交换通过引用或指针传递参数的值?

我有两个整数变量 i 和 j,我想做一个函数 它将这两个变量作为其参数并交换它们的 使用异或运算符的内容。

为什么?

正如你所发现的,你需要传递指向对象的指针,或者使用引用。

这:

x^=y^=x^=y;

具有未定义的行为,因为它在序列点之间修改同一对象两次(它对xy都这样做)。

如果两个对象是同一对象,则异或技巧将失败;第一个异或将对象归零。

如果要交换两个对象,只需使用临时对象:

int temp = x;
x = y;
y = temp;

这很简单,而且有效

正如其他人所指出的,这是一个非常愚蠢的优化(如果你可以这么称呼它的话)。 问题是就地运算符的链式使用。 将其分解为可分离的语句,它有效。

x^=y;  // values are X^Y, Y
y^=x;  // values are X^Y, X
x^=y;  // values are Y, X

像其他人一样,我鼓励你不要用这种清晰杀人的聪明来迷惑你的代码,除非你有一个明显的需要通过分析和一个明显的加速来做你的小技巧。(很酷的网站)