правило не распространяется. f1
, f2
и f3
могут быть оценены в любом порядке.
Чтобы расширить немного на некоторых из путаницы (потому что люди продолжают размещение неправильных ответов), оператор старшинство делает не влияет на порядок, в котором находятся оценивали. Возьмем такой пример:
f1() * f2() + f3()
Теперь мы знаем, что да, результаты f1()
и f2()
умножаются, а затем добавляют к результату f3()
, но мы не знаем порядок оценки. Дерево синтаксического анализа выглядит следующим образом:
+
/ \
* f3()
/ \
f1() f2()
Но мы не знаем, если левая сторона или правая сторона +
будет оцениваться в первую очередь. Это может быть так или иначе. То же самое с *
: мы не знаем, будет ли сначала оценена его левая или правая сторона.
компилятор можно назвать f3()
, а затем сохранить результат, а затем вызвать f2()
, магазин, результат, а затем вызвать f1()
, а затем использовать сохраненные результаты для выполнения фактического расчета.
Или, наоборот, он может позвонить f1()
, сохранить результат, а затем вызвать f2()
, а затем использовать эти два значения для умножения (а затем сохранить этот результат), а затем вызвать f3()
и закончить вычисление.
В каждом из этих случаев (или любой другой перестановке порядка оценки) функции оценивались в другом порядке, и тем не менее тот же ответ был достигнут.
В заключение: приоритет операторов определяет дерево разбора, не порядок оценки. Порядок, в котором оценивается дерево разбора, не определен.
@Mat - Спасибо, что указали это. Да, это действительно повторяющийся вопрос – rgk