C++ 使用引用或指针通过xor运算符交换两个变量的值
我有两个整数变量I和j,我想做一个函数,把这两个变量作为它的参数,用xor运算符交换它们的内容。现在,如果我让函数按值获取参数,即C++ 使用引用或指针通过xor运算符交换两个变量的值,c++,reference,swap,xor,C++,Reference,Swap,Xor,我有两个整数变量I和j,我想做一个函数,把这两个变量作为它的参数,用xor运算符交换它们的内容。现在,如果我让函数按值获取参数,即voidswap(intx,inty)(函数体与下面的函数swap相同)然后值在函数内被很好地交换。但我想要的是调用函数中变量值的交换,我使用了通过引用(以及指针)传递参数: void交换(int&x,int&y) { x^=y^=x^=y; 库特 我有两个整数变量I和j,我想做一个函数 它将这两个变量作为它的参数并交换它们的 内容使用xor运算符 为什么? 正如您所
voidswap(intx,inty)
(函数体与下面的函数swap
相同)然后值在函数内被很好地交换。但我想要的是调用函数中变量值的交换,我使用了通过引用(以及指针)传递参数:
void交换(int&x,int&y)
{
x^=y^=x^=y;
库特
我有两个整数变量I和j,我想做一个函数
它将这两个变量作为它的参数并交换它们的
内容使用xor运算符
为什么?
正如您所了解的,您需要传递指向对象的指针,或者使用引用
这:
具有未定义的行为,因为它在序列点之间修改同一对象两次(它对x
和y
都这样做)
如果两个对象是同一个对象,则xor技巧将失败;第一个xor将对象置零
如果要交换两个对象,只需使用临时:
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
和其他人一样,我鼓励你不要用如此清晰的技巧来迷惑你的代码,除非你有明显的需求,需要通过分析来建立,并有明显的加速来完成你的任务。(酷网站):你意识到C++有STD::SWAP,所以你不需要做不可取的事情,比如XOR SWAP。XOR交换在任何情况下都是不可取的,除非你正在执行一个系统特定的库函数,并且证明它在你的系统上更快。而且,在<代码> x< /COD>别名>代码> y>代码>时,你还没有解决可怕的失败模式。cirronimbo:No.std::swap
in(在C++03中)或(在C++11中)。(1)您只是猜测它更快(2)正如您所编写的那样,它可能会混淆一些较旧的编译器,并且它有别名错误(3)这比只写temp=y;y=x;x=temp
更不清楚。写下你的意思,让编译器优化,除非你证明这不够好。这意味着即使我让函数按值取参数,我也可能在其他编译器中得到错误的结果?是的,尽管按值或按引用事情的不同与x^=y^=x^=y
未定义这一事实没有任何关系。我喜欢Python的原因之一是,轻松交换:-)x,y=y,x
@Levon-std::swap(x,y)
也不算太糟糕。但有些人只是想让事情变得更艰难。谢谢。我应该弄明白这一点。我总是倾向于忘记序列点。。
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