sequenced-before modification order consistency
The sequenced-before (not the same as happens-before) relationships are not specific to multithreading. They happen in single threaded programs as well. Any expression that ends with a semicolon is sequenced-before the next, so in this case A
is sequenced before B
and C
before D
because each of them is a full-expression.
From the Standard 1.9 Program execution 14:
Every value computation and side effect associated with a full-expression is sequenced before every value computation and side effect associated with the next full-expression to be evaluated.
You can find an explanation here:
Order of evaluation