1

我想使用xor 算法交换两个局部变量,但是它不允许我更改变量的地址。如果我创建指向变量的指针,它将允许它,但是否可以在不使用指针的情况下做到这一点?

我正在尝试这样做

Point a = Point();
Point b = Point(1,1);

&a ^= &b;
&b ^= &a;
&a ^= &b;

这是我最接近我想做的事情

Point a = Point();
Point b = Point(1,1);

Point *a_ptr = &a;
Point *b_ptr = &b;

a_ptr = (Point *)(((unsigned long)a_ptr) ^ (unsigned long)b_ptr);
b_ptr = (Point *)(((unsigned long)a_ptr) ^ (unsigned long)b_ptr);
b_ptr = (Point *)(((unsigned long)a_ptr) ^ (unsigned long)b_ptr);

// The pointers are switched, but this will not work
&a = a_ptr;
4

2 回答 2

1

唯一可能的方法是,如果您实际上对点的值进行了异或交换。在您的代码中,您似乎正在尝试在堆栈上设置一个值的地址,而这是您无法做到的。

我推荐的是使用std::swap.
http://en.cppreference.com/w/cpp/algorithm/swap
要使用它,您的对象将被赋予 moveContructible 和 moveAssignable。

所以简而言之,不,你想做的事情是不可能的,因为你不能分配给变量的地址。但是您可以通过使用点的值、制作指针或std::swap

于 2013-07-04T01:09:36.297 回答
0

C 语言变量不像高级语言中的变量那样在运行时存在。局部变量“a”对编译器来说意味着“堆栈帧的地址 - 2”,或者它是什么。此引用仅在编译时存在,并由声明修复。在运行时,生成的代码只是从硬编码地址中获取。因此,使用代码使变量指向不同的位置是试图改变一些不存在的东西。

于 2013-07-04T01:49:37.093 回答