通过 xor 运算符使用引用或指针交换两个变量的值
Interchanging values of two variables by xor operator using references or pointers
我有两个整数变量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;
具有未定义的行为,因为它在序列点之间修改同一对象两次(它对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
像其他人一样,我鼓励你不要用这种清晰杀人的聪明来迷惑你的代码,除非你有一个明显的需要通过分析和一个明显的加速来做你的小技巧。(很酷的网站)
相关文章:
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 命令行参数,cant 或两个变量
- 在 for 循环中更新两个变量时遇到问题C++
- C++ 编译时在两个变量之间交替
- C++ 如何在包含两个变量的结构中存储与变量不同数量的值?
- 为什么一个接一个声明的两个变量在内存中不相邻?
- 为什么动态分配的两个变量的内存位置不是连续的?
- 是否可以在C++中使用宏交换两个变量的出现?
- 计算机如何分配两个变量,我们如何计算两个变量之间的距离?
- 正确证明C 中的两个变量合理(我想将它们视为一个变量)
- 可视C 编译器将相同的存储位置提供给两个变量
- 尝试使用 {} 和 std::make_pair() 交换两个变量时的行为不同
- 在rootframework中的根文件中编写两个变量
- 最短路径,带有两个变量
- 加入两个变量和LCD打印
- 在循环中声明两个变量以逆转字符串?在C 中
- 具有两个变量的"for"循环,一个变量每次迭代递增,每隔一次迭代递增
- 如何在C++中使用一个类中两个变量的值
- 仅在C 中的一个变量上,两个变量函数的数值集成(使用数值配方库)
- 如何在我存储的两个变量之间生成随机数