要交换整数A和B,这似乎适用于C,
A = A + B - ( B = A);
为什么这样做? 如果这适用于所有条件,是否可以用它来缩短任何其他常用的算法?
答案 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)
这比标准/显而易见的方式“更短”,使用的行数/分号数。
你永远不应该使用它。