αλε*_*λυτ 6 c++ undefined-behavior language-lawyer c++11
我仍然无法清楚地理解表达式是否x ^= y ^= x ^= y;
在C++ 11中有效(正如他们在这个帖子中所说的那样)或者它会导致未定义的行为?
这个链接给出的理由似乎令人信服,但是clang却发出警告:
警告:未经测试的修改和访问'x'[-Wunsequenced]
而且,如果两个版本:
x ^= y ^= x ^= y; // (1)
x = x ^ (y = y ^ (x = (x ^ y))); // (2)
Run Code Online (Sandbox Code Playgroud)
被认为是等价的(并且在C++ 11中定义明确),为什么它会给出不同的结果(第一,第二)?
另外,应该注意的是,gcc 仅在第二版代码上给出关于序列点的警告.
Col*_*mbo 11
赋值运算符(=)和复合赋值运算符都是从右到左分组.[..]
表单表达式的行为E1 op = E2等同于E1 = E1 op E2仅E1计算一次的表达式.
因此,您的代码相当于
x = x ^ (y ^= (x ^= y)));
Run Code Online (Sandbox Code Playgroud)
... x只评估一次x = x ....不幸的是,对于xor来说,对操作数的评估是不确定的.即
除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的评估是不确定的.
适用.但现在我们遇到了一个问题:
x = x ^ (y ^= (x ^= y)));
// * ******
// | |
// | Side effect
// Value computation
Run Code Online (Sandbox Code Playgroud)
值计算(在x最左边的两个单一评估中暗示x)和副作用彼此不相关,因此我们诱导UB:
如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义.