2012-05-18 3 views
2

Может ли кто-нибудь дать мне правильное объяснение о lvalues ​​и rvalues ​​в c. Я не нашел подходящего. если у кого есть ссылка, вы можете вставить т в качестве комментария.Lvalues ​​и Rvalues ​​в C

ответ

2

л-значение является лицом, чьи адреса (обычно исключений: зарегистрировать переменные) может быть приняты & они находятся в памяти достаточно долго, чтобы упоминаться под именем.
r-values ​​ are переменные объекты, чей адрес не может быть принят & они не проживают в памяти достаточно долго, чтобы называться по имени, они безымянны. Часто также называются безымянными временными объектами.

Sample Program:

int returnanInteger() 
{ 
    int i = 10; 
    return i; 
} 

void doSomething(int i) 
{ 
    //do something, right now we don't care 
} 
int main() 
{ 
    int i = 20; 
    doSomething(returnanInteger()); 

    return 0; 
} 

В приведенной выше программе i в main() является л-значение потому, что его адрес может быть принято и оно может быть отнесено именем.
Хотя в заявлении:

doSomething(returnanInteger()); 

Значение, возвращаемое returnanInteger() является г-значение, это адрес не может быть принято, и он не останется в памяти достаточно долго, чтобы быть переданы NAY name.It немедленно копируется для передачи в качестве аргумента функции doSomething().

+1

ваше заявление о lvalues ​​является довольно missleading: составные литералы и 'malloc' обеспечивают lvalues ​​тоже. И не все lvalues ​​позволяют брать адрес базового объекта, а переменные 'register' - нет. Ваше утверждение о rvalues ​​не намного лучше: переменная в C имеет очень специфическое значение как именованный объект. Вероятно, вы имеете в виду объект. –

+0

@JensGustedt: Цель заключалась в том, чтобы максимально упростить его для кого-то, кто полностью не знал о них. Если бы мне пришлось предоставить наиболее точное определение, я бы просто привел некоторые стандартные кавычки C99, но я сомневаюсь, что это поможет OP в понимании чего-либо в любом случае. Это приводит к тому, что OP начинается с наименьшей базовой идеи. –

+1

Это может быть просто, но эффект в том, что он просто ошибается. –

0

Все значения в правой части = ("equal" для входа в c-программирование) являются значениями. Подобно x = 23; c = 'x'; int * ptr = & x;

здесь 23, «х» и '& х»являются rvalues ​​ Соответственно х, с и * PTR являются lvalues.They представляют переменные или объекты в памяти Вы никогда не можете положить rvalues ​​на левой стороне из = («равно», чтобы войти в программирования C)

Смотрите эту ссылку -. http://www.devx.com/tips/Tip/5696 для получения дополнительной информации Rgds SOFTY

0

упрощение будет видеть lvalues ​​как типизированных «объекты», которые имеют явное распределение в программе, либо как переменные, сложные литералы, либо через malloc или аналогичные механизмы. В зависимости от их типа, lvalues ​​могут быть модифицируемыми или нет (указаны с номером const для типа), и вам может быть разрешено принять его адрес или нет (указан в register для объявления переменных).

rvalue - это просто «значение», которое программа производит как промежуточный шаг в оценке и для которого компилятор может свободно выбирать конкретное представление, которое лучше всего подходит. Rvalues ​​не могут быть изменены, и их адрес обычно не может быть взят. (Есть очень особенное обстоятельство, которое позволяет принять его для оценки компонентного компонента.)

0

lvalues ​​(left-values) (обычно) находятся в левой части оператора равенства = =.

rvalues ​​(right-values) находятся с правой стороны от оператора равенства = =.

lvalues ​​ - это объекты, расположенные в памяти (адрес). lvalues ​​удаляются после того, как блок, в котором они были объявлены, завершается.

rvalues ​​ - временные значения, которые удаляются, как только они инициализируются или назначаются значению l.

Пример: int a = 1 + 2;

В приведенном выше примере, «а» является именующим, поскольку она находится в левой части оператора равенства и выражение «1 + 2» является Rvalue, поскольку она находится в правом стороны оператора равенства. Как только этот оператор выполняется, переменная «a» (теперь инициализированная до 3) сохраняется в памяти, а выражение «1 + 2» автоматически удаляется.

Вот ссылка: https://msdn.microsoft.com/en-us/library/f90831hc.aspx

0

L-значение: «L-значение» относится к ячейке памяти, которая идентифицирует объект. Значение l может отображаться как в левой, так и в правой части оператора присваивания (=). l-значение часто представляет собой идентификатор.

Выражения, относящиеся к изменяемым местоположениям, называются «изменяемыми значениями l». Модируемое значение l не может иметь тип массива, неполный тип или тип с атрибутом const. Для структур и объединений, подлежащих модификации lvalues, они не должны иметь никаких членов с атрибутом const. Имя идентификатора обозначает место хранения, а значением переменной является значение, хранящееся в этом месте.

Пример:

// 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 

R-значение:. «р-величина» относится к значению данных, которые хранятся в какой-то адрес в памяти A R-значение является выражением, которое не может имеют значение, присвоенное ему, что означает, г-значение может появиться на правом, но не на левой стороне оператора присваивания (=)

. Пример:

// 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; 

enter image description here

Смежные вопросы