"++ l*= m"是未定义的行为吗?

Law*_*nce 16 c++ c++11

我已经开始研究C++ 0x了.我偶然发现了以下表达方式:

int l = 1, m=2;
++l *= m;
Run Code Online (Sandbox Code Playgroud)

我不知道第二个表达式是否有明确定义的行为.所以我在这里问.

不是UB吗?我只是渴望知道.

Joh*_*itb 14

该表达式在C++ 0x中定义良好.Prasoon 在此提供了一个非常标准的引用常见问题解答.

我不确信,这样的高比率(字面标准引用:说明文字)是优选的,所以我给一个附加小解释:请记住,++L等同于L += 1,而且该表达式的值计算是后测序的增量L.而在a *= b表达的价值计算a之前测序的乘法结果到的分配a.

你有什么副作用?

  • 增量
  • 乘法结果的分配

两种副作用通过上述两种顺序进行传递测序,然后进行测序.


Håv*_*d S 3

在上面的代码中, 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 的答案是正确的,并记录了该语句的顺序。当然,他的回答应该归功于他。