(pronounced "ell-value"): An expression that is an lvalue may
appear as either the left-hand or right-hand side of an assignment.
(pronounced "are-value"): An expression that is an rvalue may
appear on the right- but not left-hand side of an assignment.
Variables are lvalues and so may appear on the
left-hand side of an assignment. Numeric literals are rvalues and so may
not be assigned. Given the variables:
int units_sold = 0;
double sales_price = 0, total_revenue = 0;
it is a compile-time error to write either of the following:
// error: arithmetic expression is not an lvalue
units_sold * sales_price = total_revenue;
// error: literal constant is not an lvalue
0 = 1;
Some operators, such as assignment, require that one of their
operands be an lvalue. As a result, lvalues can be used in more contexts than
can rvalues. The context in which an lvalue appears determines how it is used.
For example, in the expression
units_sold = units_sold + 1;
the variable units_sold is used as the operand to
two different operators. The + operator cares only about the values of
its operands. The value of a variable is the value currently stored in the
memory associated with that variable. The effect of the addition is to fetch
that value and add one to it.
The variable units_sold is also used as the
left-hand side of the = operator. The = operator reads its
right-hand side and writes to its left-hand side. In this expression, the result
of the addition is stored in the storage associated with units_sold;
the previous value in units_sold is overwritten.