The return value of (++a) is a l-value instead of r-value, according to MSDN explained:
http://msdn.microsoft.com/en-us/library/dy3d35h8(v=vs.80).aspx
But, I think the standard c specification do not restrict the type of return value.(l-value or r-right are both accepted by specification).
You can read the c specification at http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
In section of [6.5.3 Unary operators] the c standard just requests the value of ++a equal to (a+=1). and do not metion the type of return value.
I think the things underneath is inserting a [Seqence Point] after the prefix increment taking effect.
If you test your code in gcc, you may see the compiling error occurred when compiling the code. as:
error: lvalue required as left operand of assignment