> 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
No.
> 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 sequencedbefore rules of the language.
See:
http://en.cppreference.com/w/cpp/language/eval_order
Here is an example. With:
1 2 3 4

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.