Это допустимый способ обмена значениями на C++ и C#.Значения свопинга с XOR
X ^= Y;
Y ^= X;
X ^= Y;
И это допустимый способ обмена значениями на C++.
X ^= Y ^= X ^= Y;
Но почему это не работает в C#?
Это допустимый способ обмена значениями на C++ и C#.Значения свопинга с XOR
X ^= Y;
Y ^= X;
X ^= Y;
И это допустимый способ обмена значениями на C++.
X ^= Y ^= X ^= Y;
Но почему это не работает в C#?
int X = 3;
X = X + X++; // X = 6;
int X = 3
X = X++ + X; // X = 7;
Аналогично:
int X = 3;
int Y = 5;
X = (Y ^= X ^= Y)^X; // X = 5
Однако:
int X = 3;
int Y = 5;
X = X^(Y ^= X ^= Y); // X = 0
К сожалению:
X = X^(Y ^= X ^= Y)
является эквивалентностью X ^= Y ^= X ^= Y
Я проверил MSIL, сгенерированный компилятором. В первом случае все нормально - нажмите x, нажмите y, xor, pop x и т. Д. Во втором случае он начинается с нажатия x, нажмите y, нажмите x, нажмите y и закончите с использованием начального значения x в последний исключающее:
ldloc.0
ldloc.1
ldloc.0
ldloc.1
xor
dup
stloc.0
xor
dup
stloc.1
xor
dup
stloc.0
Я пытался генерировать ASM в C++ код и декомпиляции кода .NET, вот что я получил:
ASM
mov eax, DWORD PTR _X$[ebp]
mov ecx, DWORD PTR _Y$[ebp]
mov edx, DWORD PTR [eax]
xor edx, DWORD PTR [ecx]
mov eax, DWORD PTR _X$[ebp]
mov DWORD PTR [eax], edx
mov ecx, DWORD PTR _Y$[ebp]
mov edx, DWORD PTR _X$[ebp]
mov eax, DWORD PTR [ecx]
xor eax, DWORD PTR [edx]
mov ecx, DWORD PTR _Y$[ebp]
mov DWORD PTR [ecx], eax
mov edx, DWORD PTR _X$[ebp]
mov eax, DWORD PTR _Y$[ebp]
mov ecx, DWORD PTR [edx]
xor ecx, DWORD PTR [eax]
mov edx, DWORD PTR _X$[ebp]
mov DWORD PTR [edx], ecx
из моего небольшого знания сборки Я думаю, что это в основном:
X ^= Y;
Y ^= X;
X ^= Y;
C# (Сгенерировано с JetBrains dotPeek)
int& local1 = @X;
int num1 = ^local1;
int& local2 = @Y;
int num2 = ^local2;
int num3 = X ^= Y;
int num4;
int num5 = num4 = num2^num3;
^local2 = num4;
int num6 = num5;
int num7 = num1^num6;
^local1 = num7;
Не уверен в значении &,^,@
, но я думаю, что это в основном:
int xStartingValue = X;
X ^= Y;
Y ^= X;
X = xStartingValue^Y;
Что не работает ? Как ты это используешь? –
Какая ошибка заключается в компиляторе? – Lorek
@Lorek Ошибка компилятора, он просто не меняет значения. – juharr