1

要计算 的平方2.0,此代码是否

double a = 2.0;
a *= a;

有明确定义的行为?并且,等效地,与所有其他复合赋值操作和内置类型。

4

2 回答 2

2

是的。

相信相反的唯一原因是sequence points的问题,但这不适用于这里。

1) 在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。

你只修改一次,你就很好。

于 2014-05-28T12:45:08.587 回答
2

这是合法的,因为 (C++11, §1.9/15):“运算符的操作数的值计算在运算符结果的值计算之前排序”或 (C++03, §5/4 ):“在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。此外,只能访问先前的值以确定要存储的值。” (在 a *= a中,a左侧的 仅被访问以确定要存储的值。a左侧的评估是“值计算”,没有副作用。)

于 2014-05-28T13:08:33.973 回答