为什么“A = A + B - (B = A)”在C中交换值?

时间:2015-08-01 06:44:22

标签: c swap

要交换整数A和B,这似乎适用于C,

A = A + B - ( B = A);

为什么这样做? 如果这适用于所有条件,是否可以用它来缩短任何其他常用的算法?

3 个答案:

答案 0 :(得分:5)

实际上它根据标准调用未定义的行为 -

  

C99§6.5:“2。在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,先前的值应该是只读的,以确定要存储的值。“

答案 1 :(得分:2)

你不应该依赖这样的代码来工作,因为它依赖于它从左到右处理的事实。

任何不这样做的实现都会使它失败。

您应该避免编写在所有平台上并非在所有情况下都不起作用的代码,并且不依赖于编译器,或者依赖于未记录或未定义的内容。

那么,如果你从左到右,它为什么会起作用: 假设A = 1且B = 3
A = A + B - (B = A);
A = 1 + 3 - (1)= 3
B的分配发生在我离开()的地方 底线是只有从左到右处理时,B到A的分配才会发生。

从右到左处理同样的例子时: A = A + B - (B = A);
A = 1 + 1 - (1)= 1
现在首先发生B的分配。

同样,你不应该依赖那些对于读者来说不清楚的代码,以及与编译器有关的代码,这就是这种情况。

答案 2 :(得分:1)

这比标准/显而易见的方式“更短”,使用的行数/分号数。

  • 它引入了附加操作,可能会禁止编译器进行优化
  • 恶化可读性(如D.R。所述)
  • (ab)使用非标准行为(如Marion所述),这可能会使某些编译器失败

你永远不应该使用它。

相关问题