我有两个整数变量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
函数没有通过引用或指针交换参数值?
答案 0 :(得分:7)
我有两个整数变量i和j,我想创建一个函数 它将这两个变量作为参数并交换它们 使用xor运算符的内容。
为什么?
正如您所知,您需要传递指向对象的指针,或者使用引用。
此:
x^=y^=x^=y;
具有未定义的行为,因为它在序列点之间两次修改相同的对象(它对x
和y
都这样做。)
如果两个对象都是同一个对象,则xor技巧会失败;第一个xor将对象归零。
如果要交换两个对象,只需使用临时对象:
int temp = x;
x = y;
y = temp;
这很简单,可以。
答案 1 :(得分:2)
正如其他人所说,这是一个非常愚蠢的优化(如果你可以称之为)。问题是就地操作员的链式使用。把它分成可分的陈述,它有效。
x^=y; // values are X^Y, Y
y^=x; // values are X^Y, X
x^=y; // values are Y, X
与其他人一样,我鼓励你不要用清晰易懂的聪明来捣乱你的代码,除非你通过剖析和明显的加速来建立你的bit twiddling hack。 (很酷的网站)