关于交换两个变量的不用第三个变量 异或的问题

本文探讨了一种使用位运算进行变量交换的经典方法及其潜在问题,特别是当两个变量引用相同内存地址时导致的数据错误。通过具体示例和汇编级解释说明了为何此方法会导致变量值变为0。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void my_swa22p(int &a, int &b)

{
    a = a^b;
    b = a^b;
    a = a^b;

}


这个是经典的 不用第三个变量进行交换的方式; 但是这个有个 问题···

int a = 3;

my_swa22p(a,a);


就会出现问题


经过这个操作之后  a 会变成0 ;


我是这样理解的 ··

这样的话 会 在同一个地址空间上作业;

so,

a = a^b = 0011 ^ 0011 ; //这样 a 就 变成了 0

注意 因为是引用;所以 &a = &b;

因此 b 也会变成 0;

第二步 :

 b = a^b; 其实就是

b = 0000 ^ 0000;还是 0

第三步 同理 还是 0 ; 因此这个函数就把 a 变成了 0 了;


在实际应用中;这种交换是存在的;

汇编代码是这个样子的 ·· 功力不够 ;望大神执导 ···

void my_swa22p(int &a, int &b)
{
011D1420  push        ebp  
011D1421  mov         ebp,esp  
011D1423  sub         esp,0C0h  
011D1429  push        ebx  
011D142A  push        esi  
011D142B  push        edi  
011D142C  lea         edi,[ebp-0C0h]  
011D1432  mov         ecx,30h  
011D1437  mov         eax,0CCCCCCCCh  
011D143C  rep stos    dword ptr es:[edi]  
a = a^b;
011D143E  mov         eax,dword ptr [a]  
011D1441  mov         ecx,dword ptr [b]  
011D1444  mov         edx,dword ptr [eax]  
011D1446  xor         edx,dword ptr [ecx]  
011D1448  mov         eax,dword ptr [a]  
011D144B  mov         dword ptr [eax],edx  
b = a^b;
011D144D  mov         eax,dword ptr [a]  
011D1450  mov         ecx,dword ptr [b]  
011D1453  mov         edx,dword ptr [eax]  
011D1455  xor         edx,dword ptr [ecx]  
011D1457  mov         eax,dword ptr [b]  
011D145A  mov         dword ptr [eax],edx  
a = a^b;
011D145C  mov         eax,dword ptr [a]  
011D145F  mov         ecx,dword ptr [b]  
011D1462  mov         edx,dword ptr [eax]  
011D1464  xor         edx,dword ptr [ecx]  
011D1466  mov         eax,dword ptr [a]  
011D1469  mov         dword ptr [eax],edx  
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值