Standard says it is undefined behavior.
Any conforming implementation can issue a compilation error, runtime error, return 42, explode your computer or do anything else.
Trying to reason about it result is strictly theoretical: actual use of that code in application is the sign of incompetence.
Compiler might do as you says, he can evaluate all increments first and then start reading the value of i for sum operands (most likely in your case), it even can do following:
read i into a
read i into b
increment a
increment b
save a into i
save c into i
read i into b
increment b
save b into i
sum a, b and c |
result: sum is 4, i is 2.
So, do not do thing which are prohibited by language rules.