> What I'm talking about is whether those 4 promotion steps apply
The rules (usual arithmetic conversions) are a bit more involved than what those four steps specify.
For details, see: http://en.cppreference.com/w/cpp/language/operator_arithmetic#Conversions
> ONCE to ALL OPERANDS in the whole expression at once BEFORE operating anything
> MULTIPLE TIMES for ONE operator at a time
Yes; this is done (usual arithmetic conversions are performed) (individually) for the evaluation of each subexpression.
> In the associativity order of the operators in the expression.
The order in which the subexpressions are evaluated is governed by the sequenced-before rules of the language.
Here is an example. With:
int i = -2 ;
unsigned int u = 3 ;
float f = 4.0 ;
double d = 5.0 ;
evaluate i / u * f + d / i
=> due to precedence and associativity, parsed as ( (i/u) * f ) + (d/i)
1. evaluate i/u
=> apply usual arithmetic conversions => (unsigned int)i / u
=> result is unsigned int
, say r1
2. evaluate r1 * f
=> apply usual arithmetic conversions => float(r1) * f
=> the result is float
, say r2
3. evaluate d/i
=> apply usual arithmetic conversions => d / double(i)
=> the result is double
, say r3
4. evaluate r2 + r3
=> apply usual arithmetic conversions => double(r2) + r3
=> to yield the result (double
) of the whole expression
However, there the subexpression in step 3 may be evaluated before the subexpression
in step 2, or vice versa, or their evaluations may interleave. The two evaluations are unsequenced.