gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:41 24 4
gpt4 key购买 nike

<分区>

我一直认为 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

我错过了什么吗?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com