A^=B^=A^=B;c#visual studio中的意外结果

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 /

我一直认为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++中,我缺少了什么东西?

< 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