Вы путаете приоритет с порядком оценки .
Это довольно распространенная путаница.Возможно, потому что слово «предшествовать» в английском может иметь временную коннотацию.Но на самом деле это означает иерархию ранжирования (например, здесь ).
В более простом выражении a() + b() * c()
, приоритет говорит нам, что операндыоператором *
являются b()
и c()
, а операндами +
являются a()
и результат умножения.Не больше, не меньше.
Функции a,b,c
могут все еще вызываться в любом порядке.
Это правда, что вычисление значения из *
должно быть выполнено до вычисления значения из +
, потому что нам нужно знать результатпервый для того, чтобы вычислить последний.
Вычисление значения является другим шагом для оценки операндов.Операнды оператора должны быть оценены до вычисления его значения, но нет более строгого требования, чем это.Не существует правила частичного упорядочения оценивающих операндов.
Левый операнд +
может оцениваться перед правым операндом +
, даже если правый операнд состоит из множества подвыражений.Компилятор может оценить все «листовые» операнды, сохранить результаты в стеке, а затем выполнить вычисления значений.
Также не обязательно существует строгий порядок вычислений значений, например, в w() * x() + y() * z()
, два вычисления значений *
могут выполняться в любом порядке.
В вашем кодеоператор &&
имеет специальное ограничение порядка (иногда называемое короткое замыкание ).Левый операнд должен быть оценен до начала вычисления правого операнда.
Приоритет говорит нам, что левый операнд &&
равен fgg3()
, а правый операнд &&
это fggg4() < fggg5() * fggg6())
.Поэтому требуется, чтобы fgg3()
вызывался перед любым из fgg4
, fgg5
и fgg6
.Других ограничений на порядок вычисления операндов в вашем примере нет.fgg2
может произойти в любое время, а 4
, 5
, 6
могут быть в любом порядке, если они все после 3
.