c++ - 奇怪的交换宏

标签 c++

我输入了这些代码。然而,输出超出了我的预期。

#define SWAP(x,y) {x=x^y;y=x^y;x=x^y;}
#define SWAP2(x,y) {x=x+y;y=x-y;x=x-y;}
int main()
{
    int ia[] = { 1, 10, 1 };
    SWAP(ia[0], ia[0]);   // the resutl is ia[0] = 0
    SWAP(ia[1], ia[2]);   // work fine
    SWAP2(ia[1], ia[1])   // the result is ia[0] = 0    
}

谁能帮帮我?任何帮助将不胜感激。

最佳答案

你的问题是你的交换算法要求这两个参数是独立的内存块。

正如 LYF_HKN 所指出的,每个算法的第一步都会导致 xx=y 变为 0 .如果两者只是相等但仍然是不同的内存块,这很好,因为第二步将留下y。不变(因为x为0),第三步会恢复x的原始值如果 y现在等于那个原始值。

然而,当xy实际上是内存中的相同对象,然后是每个算法中的第一个操作,在设置x为 0,设置y到 0,因为 y x .因此,每个算法的其余部分仅在该存储空间中保留值 0。

关于c++ - 奇怪的交换宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39554375/

相关文章:

c++ - 我在 C++ 中使用很多结构是正常的吗?

c++ - 为什么在为 const 数据释放内存时需要 const_cast

c# - 来自 PhotoCaptureFrame 的 IMFMediaBuffer

c++ - "ListNode dummy{-1, head};"是什么意思?

c++ - 获取用户输入以形成链表

C++类返回指针

c++ - Boost::beast:多个 async_write 调用触发了断言错误

c++ - 为什么 std::equal_to 会导致动态分配?

c++ - 链接时优化和内联

c++ - C/C++ Makefile : How to build dependencies between with . c文件和其他目录下的目标文件?