要计算 的平方2.0
,此代码是否
double a = 2.0;
a *= a;
有明确定义的行为?并且,等效地,与所有其他复合赋值操作和内置类型。
要计算 的平方2.0
,此代码是否
double a = 2.0;
a *= a;
有明确定义的行为?并且,等效地,与所有其他复合赋值操作和内置类型。
是的。
相信相反的唯一原因是sequence points的问题,但这不适用于这里。
1) 在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。
你只修改一次,你就很好。
这是合法的,因为 (C++11, §1.9/15):“运算符的操作数的值计算在运算符结果的值计算之前排序”或 (C++03, §5/4 ):“在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。此外,只能访问先前的值以确定要存储的值。” (在
a *= a
中,a
左侧的 仅被访问以确定要存储的值。a
左侧的评估是“值计算”,没有副作用。)