Computers work on a stack of operations.
The following...
int c = 10;
c = c++ * --c;
is compiled into these operations...
//OpCode // Function Stack Var c
ldc.i4.s 10 // 10 is pushed onto the stack {10}
stloc.0 // pop the stack and store the value in location 0 {} 10
ldloc.0 // location 0 is pushed onto the stack {10} 10
dup // stack value is copied and pushed on stack {10,10} 10
ldc.i4.1 // 1 is added to the stack {10,10,1} 10
add // top 2 values are popped and the sum is pushed {10, 11} 10
stloc.0 // pop the stack and store the value in location 0 {10} 11
ldloc.0 // location 0 is pushed onto the stack {10} 11
ldc.i4.1 // 1 is added to the stack {10,11,1} 11
sub // top 2 values are popped and the difference is pushed {10, 10} 11
dup // stack value is copied and pushed on stack {10,10,10} 11
stloc.0 // pop the stack and store the value in location 0 {10,10} 10
mul // top 2 values are popped and the product is pushed {100} 10
stloc.0 // pop the stack and store the value in location 0 {} 100
ldloc.0 // location 0 is pushed onto the stack {100} 100
... I'm not sure that cleared anything up... but you can see while you were using the same variable everywhere (the stloc.0/ldloc.0) the actual operations work on the stack. (what I have in the braces {}). Operations (dup, add, sub, and mul) don't care about the variable indexes just the stack.
And for giggles...
int c = 10;
c = ++c * c--;
... compiles into this...
//OpCode // Function Stack Var c
ldc.i4.s 10 // 10 is pushed onto the stack {10}
stloc.0 // pop the stack and store the value in location 0 {} 10
ldloc.0 // location 0 is pushed onto the stack {10} 10
ldc.i4.1 // 1 is added to the stack {10,1} 10
add // top 2 values are popped and the sum is pushed {11} 10
dup // stack value is copied and pushed on stack {11,11} 10
stloc.0 // pop the stack and store the value in location 0 {11} 11
ldloc.0 // location 0 is pushed onto the stack {11,11} 11
dup // stack value is copied and pushed on stack {11,11,11} 11
ldc.i4.1 // 1 is added to the stack {11,11,11,1} 11
sub // top 2 values are popped and the difference is pushed {11,11,10} 11
stloc.0 // pop the stack and store the value in location 0 {11,11} 10
mul // top 2 values are popped and the product is pushed {121} 10
stloc.0 // pop the stack and store the value in location 0 {} 121
ldloc.0 // location 0 is pushed onto the stack {121} 121