交换两个整数变量而不是使用临时存储的所谓“聪明”(但实际上效率低下)的方法通常涉及以下几行:

int a = 10;
int b = 42;

a ^= b ^= a ^= b; /*Here*/

printf("a=%d, b=%d\n", a, b);

但我想知道,像^=这样的复合赋值运算符不是序列点,是吗?
这是否意味着它实际上是未定义的行为?

最佳答案

a ^= b ^= a ^= b; /*Here*/

这是未定义的行为。
在两个序列点之间多次修改对象(a)。
(c99,6.5p2)“在上一个序列点和下一个序列点之间,对象的存储值最多应通过表达式的求值修改一次。
简单赋值和复合赋值都不引入序列点。在表达式语句表达式之前和表达式语句之后有一个序列点。
序列点列在C99和C11标准的附录C(资料性)中。

关于c - 表达式a ^ = b ^ = a ^ = b中是否有序列点,还是未定义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17475166/

10-13 00:01