Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用引用或指针通过xor运算符交换两个变量的值_C++_Reference_Swap_Xor - Fatal编程技术网

C++ 使用引用或指针通过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运算符 为什么? 正如您所

我有两个整数变量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