They refer to on the left and right side of the assignment operator. The Lvalue (pronounced: L value) concept refers to the requirement that the operand on the left side of the assignment operator is modifable, usually a variable. Rvalue concept pulls or fetches the value of the expression or operand on the right side of the assignment operator. Some examples:
int age; // variable set up then later in the program age = 39;
The value 39 is pulled or fetched (Rvalue) and stored into the variable named age (Lvalue); destroying the value previously stored in that variable.
int age; // variable set up int voting age = l8; // variable set up with initialization then later in the program age = voting age;
If the expression has a variable or named constant on the right side of the assignment operator, it would pull or fetch the value stored in the variable or constant. The value 18 is pulled or fetched from the variable named voting age and stored into the variable named age.
age < 17;
If the expression is a test expression or Boolean expression, the concept is still an Rvalue one. The value in the identifier named age is pulled or fetched and used in the relational comparison of less than.
const int JACK BENNYS AGE = 39; // constant set up then later in the program JACK BENNYS AGE = 65;
This is illegal because the identifier JACK BENNYS AGE does not have Lvalue properties. It is not a modifable data object, because it is a constant.
Some uses of the Lvalue and Rvalue can be confusing.
int oldest = 55; // variable set up with initialization then later in the program age = oldest++;
Postfx increment says to use my existing value then when you are done with the other operators; increment me. Thus, the first use of the oldest variable is an Rvalue context where the existing value of 55 is pulled or fetched and then assigned to the variable age; an Lvalue context. The second use of the oldest variable is an Lvalue context where in the value of oldest is incremented from 55 to 56.