A^=B^=A^=B;c#visual studio中的意外结果
我一直认为A^=B^=A^=B交换A B。我猜这条线应该从右到左分3步计算:A^=B^=A^=B;c#visual studio中的意外结果,c#,c++,visual-studio,visual-studio-2017,C#,C++,Visual Studio,Visual Studio 2017,我一直认为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 /
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++中,我缺少了什么东西?< p>这是一个未定义的行为*,因为有多个未排序的赋值。 在C#中,这是完全有效的,零是正确的结果
看看为什么认为任何一个数字本身都是零,因为在每一个运动中,比特模式都有相等的比特。此外,异或顺序并不重要。这就是为什么B以A的旧值结束,而A以零结束
< C++ >之前,无论如何, DunnC C,但是潜在的相关:出于好奇:这代码有实际应用吗?当然没有理由这么做。有一次,我想在代码面试中表现得像个花花公子,于是我在一篇论文上写下了这个交换。几年后,我在代码中尝试了它,只是想看看我是否做对了。是的,谢谢大家。我找得很糟。问题已经回答了。很抱歉,C++17改变了分配的顺序规则,所以对你的声明要谨慎。
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