【发布时间】:2015-06-01 15:13:06
【问题描述】:
我仍然无法清楚地理解x ^= y ^= x ^= y;这个表达式是否
在 C++11 中有效(正如他们在这个 thread 中所说的那样)还是会导致未定义的行为?
链接给出的理由似乎很有说服力,但clang抛出了warning:
警告:未排序的修改和访问“x”[-Wunsequenced]
此外,如果两个版本:
x ^= y ^= x ^= y; // (1)
x = x ^ (y = y ^ (x = (x ^ y))); // (2)
被认为是等效的(并且在 C++11 中定义良好),为什么它会给出不同的结果(first、second)?
另外需要注意的是,gcc 只在第二个版本的代码中给出了一个关于序列点的warning。
【问题讨论】:
-
不,它没有明确定义。分析与this question中的
i += ++i + 1非常相似。 -
我可以为您的理智提出建议吗?别再浪费时间去想这样的事情了。不管真正的答案是什么,知道它不会以任何方式改善你作为程序员的生活。
-
@BenjaminLindley 我很确定了解 UB 以及引入它的陷阱至关重要。
-
@Columbo:当然可以,一般来说。但不是在这种特殊情况下。在这种特殊情况下,您只需要知道这是一种编写代码的愚蠢方式,所以不要这样做。那么是不是UB的问题就无关紧要了。
标签: c++ c++11 language-lawyer undefined-behavior