People always get this so confused, which is unfortunate because in C# it is extremely straightforward. The rules are:
subexpressions are observed to be evaluated left to right when observed from the executing thread, period, end of story. (Order of evaluation is permitted to be observed to be different by some other thread if some other thread is watching the side effects.)
the order in which the operators execute is determined by their precedence and associativity.
Those are the only two relevant rules, and they completely define the behaviour of the code you give. In
i += ++i;
first i is evaluated, then ++i is evaluated, and then the += is executed.
a[++i] = i;
First 'a' is evaluated, then ++i is evaluated, then the indexing operator runs, then i is evaluated, then the assignment happens.
int result = fun() - gun();
first result is evaluated, then fun, then gun, then the subtraction, then the assignment.
Please also quote the relevant sections from the language specification in your response!
You are perfectly capable of looking in the table of contents. It's not hard to find.