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