lvalue y rvalue en lenguaje C

valor:- 

lvalue simplemente significa un objeto que tiene una ubicación identificable en la memoria (es decir, que tiene una dirección).

  • En cualquier declaración de asignación, «lvalue» debe tener la capacidad de almacenar los datos.
  • lvalue no puede ser una función, una expresión (como a+b) o una constante (como 3 , 4 , etc.).

Valor L : «valor L» se refiere a la ubicación de la memoria que identifica un objeto. El valor l puede aparecer como lado izquierdo o derecho de un operador de asignación (=). El valor l a menudo se representa como identificador. Las expresiones que se refieren a ubicaciones modificables se denominan « valores l modificables «. Un valor l modificable no puede tener un tipo de array, un tipo incompleto o un tipo con elatributo const . Para que las estructuras y las uniones sean lvalues ​​modificables , no deben tener ningún miembro con elatributo const . El nombre del identificador denota una ubicación de almacenamiento, mientras que el valor de la variable es el valor almacenado en esa ubicación. Un identificador es un lvalue modificablesi se refiere a una ubicación de memoria y si su tipo es aritmético, estructura, unión o apuntador. Por ejemplo, si ptr es un puntero a una región de almacenamiento, entonces *ptr es un valor l modificable que designa la región de almacenamiento a la que apunta ptr . En C, el concepto se renombró como «valor localizador» y se refirió a expresiones que ubican (designan) objetos. El valor l es uno de los siguientes:

  1. El nombre de la variable de cualquier tipo, es decir, un identificador de tipo integral, flotante, puntero, estructura o unión.
  2. Una expresión de subíndice ([ ]) que no se evalúa como una array.
  3. Una expresión de indirección unaria (*) que no se refiere a una array
  4. Una expresión de valor l entre paréntesis.
  5. Un objeto constante (un valor l no modificable).
  6. El resultado de la indirección a través de un puntero, siempre que no sea un puntero de función.
  7. El resultado del acceso a miembros a través del puntero (-> o .)

C

// declare 'a' an object of type 'int'
int a;
 
// a is an expression referring to an
// 'int' object as l-value
a = 1;
 
int b = a; // Ok, as l-value can appear on right
 
// Switch the operand around '=' operator
9 = a;
 
// Compilation error:
// as assignment is trying to change the
// value of assignment operator

valor r:-

El valor r simplemente significa un objeto que no tiene una ubicación identificable en la memoria (es decir, que tiene una dirección).

  • Cualquier cosa que sea capaz de devolver una expresión o valor constante.
  • Expresiones como a+b devolverán alguna constante.

R-value : r-value” se refiere al valor de datos que se almacena en alguna dirección en la memoria. Un valor r es una expresión que no puede tener un valor asignado, lo que significa que el valor r puede aparecer a la derecha pero no a la izquierda de un operador de asignación (=). 

C

// declare 'a', 'b' an object of type 'int'
int a = 1, b;
 
a + 1 = b; // Error, left expression is
           // is not variable(a + 1)
 
// declare pointer variable 'p', and 'q'
int *p, *q; // *p, *q are lvalue
 
*p = 1; // valid l-value assignment
 
// below is invalid - "p + 2" is not an l-value
// p + 2 = 18;
 
q = p + 5; // valid - "p + 5" is an r-value
 
// Below is valid - dereferencing pointer
// expression gives an l-value
*(p + 2) = 18;
 
p = &b;
 
int arr[20]; // arr[12] is an lvalue; equivalent
              // to *(arr+12)
              // Note: arr itself is also an lvalue
 
struct S { int m; };
 
struct S obj; // obj and obj.m are lvalues
 
// ptr-> is an lvalue; equivalent to (*ptr).m
// Note: ptr and *ptr are also lvalues
struct S* ptr = &obj;

Nota : El operador unario & (dirección de) requiere un valor l como su operando. Es decir, &n es una expresión válida solo si n es un valor l. Por lo tanto, una expresión como &12 es un error. Nuevamente, 12 no se refiere a un objeto, por lo que no es direccionable. Por ejemplo, 

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

Recordando la regla mnemotécnica, los valores l pueden aparecer a la izquierda de un operador de asignación mientras que los valores r pueden aparecer a la derecha.

Referencia: https://msdn.microsoft.com/en-us/library/bkbs2cds.aspx Shubham Bansal contribuye con este artículo . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *