l-значение, r-значение в указателе C

#c #pointers

#c #указатели

Вопрос:

в программировании на C
я не могу точно понять, что такое l-значение, r-value и приведение l-value к r-value и приведение r к l.

 *x = *(x 1)
  

Комментарии:

1. Ваше выражение эквивалентно записи x[0] = x[1] , если это поможет.

Ответ №1:

Rvalue — это просто значение — 17, или 3,14, или что-то в этом порядке.

Значение lvalue — это (немного упрощающее) нечто, что ссылается на какое-либо место в памяти, которое может содержать / содержит значение.

Наиболее распространенное значение lvalue — это просто переменная, поэтому в чем-то вроде x=10 , x это значение lvalue, а 10 это значение rvalue. Фактически, это происхождение имен: lvalue было (первоначально) всем, что могло появиться в левой части присваивания, а Rvalue было чем-то, что могло появиться в правой части присваивания.

Преобразование lvalue в rvalue в основном просто означает извлечение значения, сохраненного в lvalue, из любого места, где оно хранится (обычно из памяти). На самом деле нет никакого нормального преобразования из rvalue в lvalue, хотя — как только у вас есть что-то вроде 10 , вы не можете преобразовать обратно в ячейку памяти. На данный момент это всего лишь 10, и тот факт, что может существовать некоторая переменная со значением 10 (или более одного), не означает, что вы можете преобразовать 10 обратно в переменную.

Комментарии:

1. Что означает «немного упростить»? Что может быть l-значением, которое не ссылается на какое-либо место в памяти?

2. @quickbug: бывают случаи, когда (например) вы создаете static const int и в основном просто используете его как именованную константу. Если вы никогда не используете его адрес (или что-либо подобное), велика вероятность, что компилятор не присвоит ему адрес, даже если синтаксически это значение lvalue .

3. Я не совсем понимаю. Я попробовал этот код: static const int x = 0; const int* ptr = amp;x; ptr ; printf(«% d», *ptr); Сработало как по волшебству, что означает, что ptr на самом деле является l-значением.

4. Пожалуйста, забудьте о моем предыдущем комментарии. Это реальное значение: я никогда не рассматривал статический const int как l-значение, потому что оно может находиться слева от знака равенства только один раз в своей жизни. Достаточно ли этого, чтобы претендовать на l-значение? Я готовлю курс для студентов бакалавриата. Мне не пришлось бы говорить им, что статическая константа является l-значением.

5. @quickbug: Если это обычный класс на C, то я не думаю, что была бы какая-либо причина вникать в него. Единственный способ, которым я мог бы разобраться в этом, был бы, если бы это было что-то вроде класса компиляторов, где я мог бы упомянуть этот странный маленький угловой случай. Если вы собираетесь упомянуть это, вы, вероятно, захотите упомянуть и строковые литералы: еще одна «вещь», которая официально является значением lvalue , но если вы когда-либо присвоите ее содержимому, вы получите неопределенное поведение.

Ответ №2:

Стандарт C распознает исходные термины, помещенные для left и right, как в L = R ; однако в нем говорится, что lvalue следует рассматривать как значение locator, что примерно означает, что вы можете получить адрес объекта и, следовательно, у этого объекта есть местоположение.

r-значение называется значением выражения, которое может быть литералами, int , любым значением с плавающей точкой.

Итак, в вашем примере левая сторона — это значение местоположения, в котором будет установлено значение выражения правой стороны.

Ответ №3: