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
}
{
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
}