Ну, нет, они не противоречат друг другу, хотя бы потому, что в предложениях написано «большинство»: -)
В любом случае, когда порядок операций не влияет на результат, компилятор должен свободно выбирать наиболее эффективный метод. Независимо от того, как вы нарезаете и нарезаете, 7 * 2
всегда равно 2 * 7
.
Рассмотрим утверждение:
a = (b + 1) * (c + 2)
Компилятор может выбрать, использует ли он:
(b + 1) * (c + 2)
(c + 2) * (b + 1)
или даже:
(b * c) + b + b + c + 2
при условии, что результаты совпадают (в пределах ожидаемых границ точности).
На самом деле, при условии, что результаты идентичны, даже утверждение вроде:
newval = 100 * PI * E / val * tot / 0.2
может перемещать отдельные компоненты без проблем. Если компилятор может достичь того же самого результата с помощью более быстрого или меньшего кода, он должен.
Стандарты языка, как правило, указывают, что должен быть достигнут определенный результат, а не как этот результат достигнут.