Это не имеет ничего общего с приоритетом.
В этом последнем утверждении нет точки последовательности, поэтому компилятор может свободно вычислять подвыражения в любом порядке, который ему нравится, если используется приоритет при объединении подвыражений.
Обратите внимание, что приоритет не определяет общий порядок вычисления - он просто определяет, как будут объединяться операнды выражения с несколькими операторами.
Например, в следующем выражении:
a() * b() + c()
В какой-то момент компилятор должен будет оценить (a() * b())
перед добавлением результата c()
, но нет ничего, что говорит о том, в каком порядке должен выполняться каждый отдельный вызов функции. Компилятор может довольно легко решить сначала вызвать c()
, поместить результат в стек, а затем сделать все, что ему нужно для вычисления выражения (a() * b())
(в этом случае он может решить сначала вычислить b()
).
Единственная роль, которую играет приоритет, заключается в том, что компилятору не разрешается оценивать выражение как:
a() * (b() + c())