a=b+(b=a)*0;
这句话可以在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 ?
但是b的值可能是错误的。
有人可以帮我吗?这让我很困惑。
最佳答案
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交换技巧以及Duff的设备在体面的,可维护的代码中没有位置。它们通常是编码人员显示自己有多聪明的一种方式,但通常只是表明他们有多糟糕。
如果您在生产代码中看到过类似的内容,我认为世界上没有任何陪审团会因为您追捕肇事者并通过汇总程序 list 将他们殴打致死而定罪。
您应该编写代码,好像下一个需要维护它的人是一个精神病患者,知道您的住所-在我的情况下,您应该是正确的一半-我不知道您的住所:-)
关于c# - 交换技巧: a=b+(b=a)*0;,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6950512/