Может ли кто-нибудь дать мне правильное объяснение о lvalues и rvalues в c. Я не нашел подходящего. если у кого есть ссылка, вы можете вставить т в качестве комментария.Lvalues и Rvalues в C
ответ
л-значение является лицом, чьи адреса (обычно исключений: зарегистрировать переменные) может быть приняты & они находятся в памяти достаточно долго, чтобы упоминаться под именем.
r-values are
переменные
объекты, чей адрес не может быть принят & они не проживают в памяти достаточно долго, чтобы называться по имени, они безымянны. Часто также называются безымянными временными объектами.
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()
.
В дополнение к тому, что Als уже упоминалось выше (который достаточно подробно), вы можете найти следующие ссылки полезны:
Все значения в правой части = ("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
упрощение будет видеть lvalues как типизированных «объекты», которые имеют явное распределение в программе, либо как переменные, сложные литералы, либо через malloc
или аналогичные механизмы. В зависимости от их типа, lvalues могут быть модифицируемыми или нет (указаны с номером const
для типа), и вам может быть разрешено принять его адрес или нет (указан в register
для объявления переменных).
rvalue - это просто «значение», которое программа производит как промежуточный шаг в оценке и для которого компилятор может свободно выбирать конкретное представление, которое лучше всего подходит. Rvalues не могут быть изменены, и их адрес обычно не может быть взят. (Есть очень особенное обстоятельство, которое позволяет принять его для оценки компонентного компонента.)
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
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;
- 1. C++ lvalues и rvalues
- 2. Условия для lvalues и rvalues в C
- 3. C++ lvalues, rvalues, ссылки, параметры и производительность
- 4. Назначаемые ссылка на обоих lvalues и rvalues
- 5. Функция перегрузки для rvalues и lvalues
- 6. Конструктор класса шаблонов Variadic с lvalues и rvalues
- 7. Лилированные строки и функции возвращают значения lvalues или rvalues?
- 8. Как rvalues в C++ хранится в памяти?
- 9. POD, non-POD, rvalue и lvalues
- 10. rvalues C++ 0x и перемещение в кучу
- 11. Rvalues in C++ 03
- 12. Все временные rvalues в C++?
- 13. Objective-C + CPP rvalues и массивы
- 14. Переходя неконстантная ссылки на rvalues в C++
- 15. указатели на функции, массивы и lvalues в C
- 16. Массивы и Rvalues (в качестве параметров)
- 17. Выделение и неизменность ссылок на rvalues в C++
- 18. Какова ценность rvalues?
- 19. Почему массивы не lvalues?
- 20. Скользящий тип возвращаемого значения и rvalues
- 21. rvalues и временные объекты в FCD
- 22. C++ 11: Почему присвоение rvalues разрешено?
- 23. Передача нескольких значений и lvalues функции без создания перегрузок
- 24. Являются ли эти указатели lvalues?
- 25. rvalues с копией оператора
- 26. Rvalues vs temporaries
- 27. Почему && иногда связывает lvalues и другие времена?
- 28. Передача временных страниц как LValues
- 29. Что представляет собой RValues?
- 30. Где в стандарте C++ он говорит: delete может изменить lvalues?
ваше заявление о lvalues является довольно missleading: составные литералы и 'malloc' обеспечивают lvalues тоже. И не все lvalues позволяют брать адрес базового объекта, а переменные 'register' - нет. Ваше утверждение о rvalues не намного лучше: переменная в C имеет очень специфическое значение как именованный объект. Вероятно, вы имеете в виду объект. –
@JensGustedt: Цель заключалась в том, чтобы максимально упростить его для кого-то, кто полностью не знал о них. Если бы мне пришлось предоставить наиболее точное определение, я бы просто привел некоторые стандартные кавычки C99, но я сомневаюсь, что это поможет OP в понимании чего-либо в любом случае. Это приводит к тому, что OP начинается с наименьшей базовой идеи. –
Это может быть просто, но эффект в том, что он просто ошибается. –