Пока мы говорим о встроенных операторах: нет, вы не меняете порядок оценки с помощью ()
. Вы не можете контролировать порядок оценки. На самом деле здесь нет «порядка оценки».
Компилятору разрешается оценивать это выражение любым способом, который ему нужен, при условии, что результат верен. Даже не требуется использовать операции сложения и умножения для оценки этих выражений. Сложение и умножение существуют только в тексте вашей программы. Компилятор может полностью и полностью игнорировать эти конкретные операции. На некоторой аппаратной платформе такие выражения могут оцениваться по одной атомарной машинной операции. По этой причине понятие «порядок оценки» здесь не имеет никакого смысла. Там нет ничего, к чему вы можете применить понятие «заказ».
Единственное, что вы меняете, используя ()
, - это математическое значение выражения. Допустим, a
, b
и c
- все 2
. a + b * c
должно быть равно 6
, а (a + b) * c
должно быть равно 8
. Вот и все. Это единственное, что вам гарантировано: что результаты будут правильными. Как эти результаты получены, совершенно неизвестно. Компилятор может использовать абсолютно все, любой метод и любой «порядок оценки», если результаты верны.
Для другого примера, если в вашей программе есть два таких выражения, следующих друг за другом
int x = c + a * b;
int y = (c + a) * b;
компилятор может оценивать их как
int x = c + a * b;
int y = c * b + x - c;
, который также даст правильный результат (при условии отсутствия проблем, связанных с переполнением). В этом случае фактический график оценки даже не будет выглядеть как то, что вы написали в своем исходном коде.
Короче говоря, предполагать, что фактическая оценка будет иметь какое-либо существенное сходство с тем, что вы написали в исходном коде вашей программы, в лучшем случае наивно. Несмотря на распространенное мнение, встроенные операторы, как правило, не переводятся в их машинные «аналоги».
Сказанное выше относится и к встроенным операторам. Как только мы начинаем работать с перегруженными операторами, все резко меняется. Перегруженные операторы действительно оцениваются в полном соответствии с семантической структурой выражения. Там есть некоторая свобода даже с перегруженными операторами, но она не так неограничена, как в случае встроенных операторов.