Чтобы вычислить квадрат 2.0
неужели этот код
double a = 2.0;
a *= a;
хорошо определенное поведение? И, что то же самое, со всеми остальными составными операциями присваивания и встроенными типами.
Это законно, потому что (C ++ 11, §1.9 / 15): «Расчет значений
операнды оператора упорядочены перед значением
Вычисление результата оператора «или (C ++ 03, §5 / 4):
«Между предыдущей и следующей последовательностью указать скалярный объект
его сохраненное значение должно быть изменено не более одного раза
оценка выражения. Кроме того, предыдущее значение должно
быть доступным только для определения значения, которое будет сохранено. «(В
a *= a
, a
на левой стороне доступ только для определения
значение для хранения. И оценка a
на
левая сторона — это «вычисление значения», без побочных эффектов.)
Да, это.
Единственная причина полагать обратное — это проблема с последовательность точек, но это не относится здесь.
1) Между предыдущей и следующей точкой последовательности скалярный объект должен иметь свое сохраненное значение, измененное не более одного раза путем оценки выражения.
Вы изменяете только один раз, вы хороши.