Pietro Cerutti said:
Uhm.. I've heard about lvalues and rvalues many times, but never found a
clear description of their meaning, let alone "rvalue is at the right of
an expression, lvalue is at the left", which isn't really explanatory by
itself..
Anyway, it's clear.. thank you!
If you think it's clear, then I suspect you don't really understand
it.

}
An lvalue is an expression that (potentially) designates an object.
I added the word "potentially" because of cases like this:
int *ptr = NULL;
The expression '*ptr' is an lvalue even if it doesn't *currently*
designate an object, because the lvalue-ness of an expression must be
determinable at compile time.
Unfortunately, the C90 and C99 standards both messed up the definition
of "lvalue". The C90 standard says that an lvalue is an expression
that designates an object. Taken literally, this meant that '*ptr'
either is or is not an lvalue depending on the current value of 'ptr',
which clearly is not what was intended.
The C99 standard attempted to fix this by saying that an lvalue is "an
expression with an object type or an incomplete type other than void;
if an lvalue does not designate an object when it is evaluated, the
behavior is undefined". Taken literally this implies that 42 is an
lvalue, and evaluating it invokes undefined behavior.
As for rvalues, the standard doesn't use the term except in one footnote:
What is sometimes called "rvalue" is in this International
Standard described as the "value of an expression".
The *original* meaning of "lvalue" was different. C says an lvalue is
a kind of expression. In the original pre-C meaning, an lvalue is a
result of evaluating an expression. Evaluating an expression for its
lvalue means determining what object it designates (this is possible
only if the expression actually designates an object). Evaluating an
expression for its rvalue means determining the value of the
expression.