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

时间:2011-08-05 01:36:41

标签: c# swap

a=b+(b=a)*0;

这句话可以交换a和b之间的值 我用C#尝试了它,但它确实有用 但我只是不知道它是如何运作的 e.g。

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的价值可能是错误的 谁能帮助我?这让我很困惑。

3 个答案:

答案 0 :(得分:19)

a=b+(b=a)*0;

中间的(b=a)是一个赋值语句,将b设置为a的当前值,其副作用是其结果是({1}} 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;

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

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

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

答案 1 :(得分:4)

唉!你在哪里看到的?我很习惯(a ^ = b; b ^ = a; a ^ = b;)技巧,所以我至少认出它(不要拍!我从来没有说过我用过它!),但是我我必须在一分钟内查看那个...如果你在生产代码中看到它,请弄清楚谁写了它并伤害了他。

正如其他人所说(但我想强调一下):“a = b”是一个赋值,但它也是一个带有值的表达式。这就是为什么你可以做“a = b = c = d”之类的事情 - 这不是一个特殊情况的语言技巧;它们只是分组为“a =(b =(c = d))”,“d”的值折回所有这些变量。

答案 2 :(得分:3)

  0. a=b+(b=a)*0     |             | a = 1, b = 2
  1. Evaluate b      | a=2+(b=a)*0 | a = 1, b = 2
  2. Evaluate (b=a)  | a=2+1*0     | a = 1, b = 1
  3. Evaluate 1*0    | a=2+0       | a = 1, b = 1
  4. Evaluate 2+0    | a=2         | a = 1, b = 1
  5. Evaluate a=2    |             | a = 2, b = 1
相关问题