我已经开始研究C ++ 0x了。我在某个地方遇到了以下表达:
int l = 1, m=2;
++l *= m;
我不知道第二个表达式是否有明确定义的行为。所以我在这里问。
不是UB吗?我只是渴望知道。
答案 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的答案是正确的,并记录了声明的顺序。信用当然应该回答他的答案。