I think that when looking at the problem from the sight of the syntax tree, the answer to the problem becomes clearer:
i
|
=
|
+
|
unary expression - unary expression
unary expression: unary operator expression
In our case expression boils down to the variable i.
Now what happens is that both unary expression modify the same operand, so the code does two times ++i when evaluating the unary expressions before adding the results of both unary expressions.
So what the code does is indeed
++i;
++i;
i = i + i;
For i = 5 that means
i = i + 1; //i <- 6
i = i + 1; //i <- 7
i = i + i; //i <- 14