【发布时间】:2017-12-06 02:16:01
【问题描述】:
我一直认为 A ^= B ^= A ^= B 交换 A B。我猜这条线应该分 3 步从右到左进行评估:
1) A ^= B;
2) B ^= A;
3) A ^= B;
但是在 C# 中,如果你在一行中执行,A 会以某种方式变为 0。我查看了程序集,发现原始 A 被首先存储,并且在最后第三步中以某种方式存储,而不是获取 A 的实际当前值,代码使用缓存的原始值。组装看起来像这样:
mov eax,dword ptr [ebp-40h] //eax <- A
mov dword ptr [ebp-7Ch],eax //C <- A (why cache?)
mov eax,dword ptr [ebp-44h] //eax <- B
xor dword ptr [ebp-40h],eax //A ^= B
mov eax,dword ptr [ebp-40h] //eax <- A
xor dword ptr [ebp-44h],eax //B ^= A
mov eax,dword ptr [ebp-7Ch] //eax <- C (?)
xor eax,dword ptr [ebp-44h] //eax ^= B (= C ^ B)
mov dword ptr [ebp-40h],eax //A = C ^ B (instead of A ^ B)
在 C++ 中似乎没问题,并且程序集只使用 2 个变量:
mov eax,dword ptr [a]
xor eax,dword ptr [b]
mov dword ptr [a],eax
mov ecx,dword ptr [b]
xor ecx,dword ptr [a]
mov dword ptr [b],ecx
mov edx,dword ptr [a]
xor edx,dword ptr [b]
mov dword ptr [a],edx
我错过了什么吗?
【问题讨论】:
-
不知道 C#,但可能相关:stackoverflow.com/q/38421671/3002139
-
出于好奇:该代码有实际应用吗?
-
好吧,没有理由这样做。有一次我想在代码面试中显得很花哨,我在一篇论文上写了那个交换。多年后,我在代码中实际尝试了它,只是为了看看我是否做对了。
标签: c# c++ visual-studio visual-studio-2017