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

时间:2010-12-02 15:50:02

标签: c++ c++11

我已经开始研究C ++ 0x了。我在某个地方遇到了以下表达:

int l = 1, m=2;
++l *= m;

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

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

2 个答案:

答案 0 :(得分:14)

表达式在C ++ 0x中定义良好。 Prasoon here给出了一个非常标准的引用常见问题解答。

我不相信(文字标准引言:解释性文字)这么高的比例是可取的,所以我给出了一个额外的小解释:记住++L是相当于L += 1,并且该表达式的值计算在 L的增量之后排序。在a *= b中,表达式a的值计算在将乘法结果赋值为a之前进行排序。

你有什么副作用?

  • 增量
  • 乘法结果的分配

之前之前测序的上述两个序列对这两种副作用进行了传递测序。

答案 1 :(得分:3)

在上面的代码中,前缀++优先于*=,因此首先执行。结果是l等于4

UPDATE:确实是未定义的行为。我认为优先裁定的假设是错误的。

原因是l既是*=中的左值和右值,也是++中的左值和左值。这两个操作没有排序。因此,l被写入(并且读取)两次“没有序列点”(旧的标准措辞),行为是未定义的。

作为旁注,我认为你的问题源于C ++ 0x中序列点的变化。 C ++ 0x已将关于“序列点”的措辞改为“之前排序”,以使标准更清晰。据我所知,这并没有改变C ++的行为。

更新2:根据N3126 draft for C++0x的第5.17(1),5.17(7)和5.3.2(1)节,实际上有一个明确定义的排序。 @Johannes Schaub的答案是正确的,并记录了声明的顺序。信用当然应该回答他的答案。