0

我有两个整数变量 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函数不交换通过引用或指针传递参数的值?

4

2 回答 2

7

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

为什么?

正如您所知道的,您需要将指针传递给对象,或者使用引用。

这个:

x^=y^=x^=y;

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

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

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

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

这很简单,而且很有效

于 2012-06-10T20:05:41.343 回答
2

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

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

和其他人一样,我鼓励你不要用这种破坏清晰度的聪明来混淆你的代码,除非你有一个通过分析建立的明显需求和一个明显的加速来做你的小技巧。(酷网站)

于 2012-06-10T20:18:46.137 回答