Is this explanation short, in my opinion?
Yes.
"Strictly speaking, the operand of the prefix (or postfix) increment operator must be an unmodified lvalue ...
What? An unmodifiable lvalue is something like const int n; - you can take your address (via & ), but you cannot assign it (via = , += or ++ ). You cannot increase that which cannot be changed.
To quote the standard (clause 6.5.3.1, clause 1):
The operand of the prefx increment or decrement operand must be a qualified or unqualified real or pointer type and must be a modified value of lvalue.
um.
X is a macro, which means that it does not identify a place in memory - macros use simple text replacement through a preprocessor.
It's a fake copy. Macros do not exist in C *. They are part of a preprocessor that has no concept of lvalues, rvalues, expressions or memory. This particular macro expands to an integer constant, which is an rvalue, but the macros themselves have nothing to do with any of the above. See Steve Jessop's answer for a counterexample of a macro being an lvalue.
The correct answer is that the operator expands to ++8 , and since 8 is an rvalue, it cannot be used as an argument to ++ (in any form), and therefore it will not compile. Also, depending on whether you want to compile this code as C89 or C99, leaving main without an explicit return value, probably gives undefined behavior.
* If this is the accepted answer, I suggest that I should clarify this bit: the preprocessor is part of the C programming language. It is specified in the C standard, and the compiler must implement preprocessing to be a C compiler. However, the C language (i.e. syntax, semantics, library, etc.) Does not interact with the preprocessor - as soon as you get to the scene where you start working with lvalues and rvalues, the preprocessor has already been executed for a long time and all macros are fully expanded. Macros themselves do not have a place in the syntax, because they are not part of the "language". There was some debate (in Steve Jessop's answer) that the use of the term “language” is misleading here, and I agree with him that it is, I just can't find a better word to use.