a=b+(b=a)*0;
То, что (b=a)
в середине, является установкой оператора присваивания b
для текущего значения a
с побочным эффектом, что его результат (окончательное значение) b
.Когда это умножается на 0, вы получаете 0, но присвоение все же произошло.
Внешний бит устанавливает a
в b
плюс результат (b=a)*0
(который равен нулю).Поскольку исходный b
уже использовался для начала установки a
до назначения в бите (b=a)
, назначение не влияет на a
.Другими словами, это атомарное a = b; b = a;
, меняющее два значения.
C # оценивает вещи в строгом порядке слева направо (в отличие от C и C ++), чтобы избежать большого класса тонких ошибок.Обратите внимание, что компилятор может оценивать их в другом порядке, но только если он может определить, что он не будет иметь никакого эффекта (здесь это не так).
Фрагмент, который вы разместили, работает, ноэто также отвратительно и не очень хорошая идея, особенно когда вы можете просто использовать гораздо более удобочитаемую информацию:
int t = a; a = b; b = t;
Трюки, такие как то, что вы видите здесь, трюк подкачки XOR и устройство Даффа не имеют места в приличномисправный код.Они обычно дают возможность кодировщикам показать, насколько они умны, но обычно они просто показывают, насколько они плохи .
Если вы когда-нибудь увидите что-то подобное в рабочем коде, я не думаю, что какое-либо жюри в мире осудит вас за то, что выследили преступника и избили его до смерти с помощью свернутого списка программ.
Вы должны написать свой код, как если бы следующий человек, который должен поддерживать его, был психопатом, который знает, где вы живете - в моем случае, вы были бы наполовину правы - я понятия не имею, где вы живете: -)