我已经开始研究C++ 0x了.我偶然发现了以下表达方式:
int l = 1, m=2;
++l *= m;
我不知道第二个表达式是否有明确定义的行为.所以我在这里问.
不是UB吗?我只是渴望知道.
在上面的代码中, prefix++优先于*=,因此首先执行。结果l等于4。
更新:这确实是未定义的行为。我关于优先权的假设是错误的。
原因是l既是 中的左值又是右值*=,也是 中的++。这两个操作没有顺序。因此,l“没有序列点”(旧标准措辞)被写入(和读取)两次,并且行为是未定义的。
作为旁注,我认为您的问题源于 C++0x 中序列点的更改。C++0x 已将有关“序列点”的措辞更改为“之前排序”,以使标准更加清晰。据我所知,这不会改变 C++ 的行为。
更新 2:事实证明,根据C++0x 的 N3126 草案的第 5.17(1)、5.17(7) 和 5.3.2(1) 节,实际上有一个明确定义的排序。@Johannes Schaub 的答案是正确的,并记录了该语句的顺序。当然,他的回答应该归功于他。