This has nothing to do with priority.
There is no sequence point in this last statement, so the compiler can freely evaluate subexpressions in any order if it is used when combining subexpressions.
Please note that priority does not determine the general order of evaluation - it simply determines how expression operands will be combined with several operators.
For example, in the following expression:
a() * b() + c()
at some point, the compiler will have to evaluate (a() * b()) before adding the result of c() , but nothing is said about what order each individual function call should perform. The compiler can easily decide to call c() , push the result on the stack, and then do whatever it needs to evaluate the expression (a() * b()) (in this case, it can decide to evaluate b() first
The only role that priority plays is that the compiler is not allowed to evaluate the expression as:
a() * (b() + c())
source share