交换技巧:a = b +(b = a)*0;

cin*_*ndy 15 c# swap

a=b+(b=a)*0;
Run Code Online (Sandbox Code Playgroud)

这句话可以交换a和b之间的值.
我用C#尝试了它,它的工作原理.
但我只是不知道它是如何工作的.
例如

a = 1,b = 2

我列出了它的步骤如下:

b = a -> a = 1, b = 1
b * 0 -> a = 1, b = 1
b + 0 -> a = 1, b = 1
a = b -> a = 1, b = 1 ?
Run Code Online (Sandbox Code Playgroud)

但是b的价值可能是错误的.
谁能帮助我?这让我很困惑.

pax*_*blo 19

a=b+(b=a)*0;
Run Code Online (Sandbox Code Playgroud)

(b=a)中间是一个赋值语句设置b到的当前值a与副作用,其结果是(最终值)b.当它乘以0时,你得到0,但分配仍然发生.

外部位设置ab加上结果(b=a)*0(为零).由于原始版本b已用于在位中赋值a之前开始设置(b=a),因此赋值不会对其产生影响a.换句话说,它是一个原子a = b; b = a;,交换这两个值.

C#以严格的从左到右的顺序评估事物(与C和C++不同),以避免大量的细微错误.请注意,编译器可以以不同的顺序对它们进行评估,但前提是它可以确定它不起作用(这不是这里的情况).

你发布的片段有效,但也很可怕,不是一个好主意,特别是当你可以使用更具可读性时:

int t = a; a = b; b = t;
Run Code Online (Sandbox Code Playgroud)

像你在这里看到的技巧,以及XOR交换技巧,Duff的设备在适当的,可维护的代码中没有位置.对于程序员而言,它们通常是一种表明他们多么聪明的方式,但他们通常只是表明他们有多糟糕.

如果您在生产代码中看到过类似的内容,我认为世界上任何陪审团都不会因为追查肇事者而将其殴打致死,并通过卷起的计划列表将其殴打致死.

你应该编写你的代码,好像下一个必须维护它的人是一个知道你住在哪里的精神病患者 - 在我的情况下,你是对的一半 - 我不知道你住在哪里:-)