lvalue and rvalue in C language
lvalue:-
lvalue simply means an object that has an identifiable location in memory (i.e. having an address).
- In any assignment statement “lvalue” must have the capability to store the data.
- lvalue cannot be a function, expression (like a+b) or a constant (like 3 , 4 , etc.).
L-value: “l-value” refers to memory location which identifies an object. l-value may appear as either left hand or right hand side of an assignment operator(=). l-value often represents as identifier. Expressions referring to modifiable locations are called “modifiable l-values“. A modifiable l-value cannot have an array type, an incomplete type, or a type with the const attribute. For structures and unions to be modifiable lvalues, they must not have any members with the const attribute. The name of the identifier denotes a storage location, while the value of the variable is the value stored at that location. An identifier is a modifiable lvalue if it refers to a memory location and if its type is arithmetic, structure, union or pointer. For example, if ptr is a pointer to a storage region, then *ptr is a modifiable l-value that designates the storage region to which ptr points. In C, the concept was renamed as “locator value”, and referred to expressions that locate (designate) objects. The l-value is one of the following:
- The name of the variable of any type i.e. , an identifier of integral, floating, pointer, structure, or union type.
- A subscript ([ ]) expression that does not evaluate to an array.
- A unary-indirection (*) expression that does not refer to an array
- An l-value expression in parentheses.
- A const object (a nonmodifiable l-value).
- The result of indirection through a pointer, provided that it isn’t a function pointer.
- The result of member access through pointer(-> or .)
C
// declare ‘a’ as int variable and
// ‘p’ as pointer variable
int a, *p;
p = &a; // ok, assignment of address
// at l-value
&a = p; // error: &a is an r-value
int x, y;
( x < y ? y : x) = 0; // It’s valid because the ternary
// expression preserves the "lvalue-ness"
// of both its possible return values
r-value:-
r-value simply means, an object that has no identifiable location in memory (i.e. having an address).
- Anything that is capable of returning a constant expression or value.
- Expression like a+b will return some constant.
R-value: r-value” refers to data value that is stored at some address in memory. A r-value is an expression, that can’t have a value assigned to it, which means r-value can appear on right but not on left hand side of an assignment operator(=).
C
int a = 1, b;
a + 1 = b;
int *p, *q;
*p = 1;
q = p + 5;
*(p + 2) = 18;
p = &b;
int arr[20];
struct S { int m; };
struct S obj;
struct S* ptr = &obj;
|
Note: The unary & (address-of) operator requires an l-value as its operand. That is, &n is a valid expression only if n is an l-value. Thus, an expression such as &12 is an error. Again, 12 does not refer to an object, so it’s not addressable. For instance,
Remembering the mnemonic, that l-values can appear on the left of an assignment operator while r-values can appear on the right.
Reference: https://msdn.microsoft.com/en-us/library/bkbs2cds.aspx
Last Updated :
22 Jun, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...