【发布时间】:2013-07-02 17:55:54
【问题描述】:
交换两个整数变量而不是使用临时存储的所谓“聪明”(但实际上效率低下)的方法通常涉及以下行:
int a = 10;
int b = 42;
a ^= b ^= a ^= b; /*Here*/
printf("a=%d, b=%d\n", a, b);
但我想知道,像^= 这样的复合赋值运算符不是序列点,是吗?
这是否意味着它实际上是未定义的行为?
【问题讨论】:
-
如果您编写的代码难以判断发生了什么,请问自己是否有更直接的方法可以让未来的开发人员理解?
-
请注意,如果您在 C++ 代码中看到过这一点,C++ 对赋值运算符有不同的规则,允许在 C 中未定义的某些构造(我不确定这一点)。跨度>
-
@OliCharlesworth 我在那里投票决定关闭,因为在这里我们有更好的答案:)
-
@EdHeal,在我最初接触 C 的时候,我可能已经写过这样的代码,但多年来我已经知道得更多了。我把“聪明”放在引号里是有原因的。:-)
标签: c undefined-behavior sequence-points compound-assignment