I think everyone here knows that `--i` is a left value expression while `i--` is a right value expression. But I read the Assembly code of the two expression and find out that they are compiled to the same Assembly code:

`mov eax,dword ptr [i]  

sub eax,1  

mov dword ptr [i],eax`

In C99 language standard, An lvalue is defined to an expression with an object type or an incomplete type other than void.

So I can ensure that `--i` return a value which is an type other than void while `i--` return a value which is void or maybe a temp variable.

However when I give a assignment such as `i--=5`, the compiler will give me an error indicating `i--` is not a lvalue, I do no know why it is not and why the return value is a temp variable. How does the compiler make such a judgement? Can anybody give me some explanation in Assembly language level？Thanks!