..and, to make a positive contribution to the thread, another way to look at the difference between precedence/associativity and evaluation order is to consider when they apply during compilation:
Given this source code:
total += i->CurrentItem()->NetPrice()
The compiler first tokenizes this line of characters, to produce this sequence:
{"total", "+=", "i", "->", "CurrentItem", "()", "->", "NetPrice", "()"}
Then it has to convert the bland stream of tokens into a tree (abstract syntax tree). This is where precedence/associativity come in: they tell the compiler how those tokens are related
i CurrentItem
\ /
[->]
\
[()] NetPrice
\ /
[->]
\
[()] total
\ /
[+=]
\
[discard]
|
(in this picture, each line from top to bottom should be read as "uses the result of".
Next, the compiler has to convert this tree to actual executable code - that's where order of evaluation comes in. in C++, order of evaluation is arbitrary: it can walk this tree depth-first, breadth-first, left-to-right, right-to-left, hop around the branches randomly, doesn't matter at all, as long all the "uses the result of" lines are faithfully reproduced in code
For example, a compiler could convert this tree to this sequence of instructions:
1. read from total
2. read from CurrentItem
3. read from i
4. execute ->
5. read from NetPrice
6. execute ()
7. execute ->
8. execute ()
9. execute +=
...technically things get more complicated with some built-in operators, including the += here, and with the above-mentioned "sequenced-before" rules, but this could serve as a mental model to explain the distinction between precedence/associativity (how the source code is read) and evaluation order (how the machine code is written)