L-значение запроса в C - PullRequest
       15

L-значение запроса в C

1 голос
/ 27 августа 2011

У меня была путаница относительно значения -l и значения r. рассмотрим код

int x; x=5;

с

int x

пространство памяти зарезервировано для переменной int. затем ему присваивается значение 5. мой вопрос

  1. объявление означает, что x является l-значением?
  2. если x имеет адрес 0xyyyy в памяти, & x ссылается на этот адрес. Является ли этот адрес 0xyyy значение l, т. е. & x является значением l? но адрес var является указателем, поэтому, l-значение становится указателем переменной?

Ответы [ 5 ]

3 голосов
/ 27 августа 2011

Насколько я понимаю, lvalue - это просто причудливый термин для выражения, которое вы можете назначить. Другими словами, если что-то может появиться в левой части оператора a =, это lvalue. Это означает, что x является lvalue, а &x - нет - вы не можете переназначить адрес x чему-то другому.

Если у вас есть такая функция, как int* getIntPtr(), то getIntPtr() не является lvalue (запись getIntPtr() = 5 не имеет никакого смысла), но *(getIntPtr()) - это.

Редактировать: По-видимому, это не совсем так просто. Если x был определен как const, x все равно будет lvalue (называемым неизменяемым lvalue), даже если вы не можете присвоить ему. Я не уверен, есть ли другие исключения.

1 голос
/ 27 августа 2011

lValue => Если вы можете взять адрес выражения, то это lValue.

10 = a; // Can we take the address of 10 ?

rValue => Если вы не можете взять адрес экспресса, тогда это rValue.

a = 10;

Есть еще некоторые исключения. Например, тип массива - это lValue , адрес которого не может быть принят или назначен.

int a[5] ;  // &a => Not valid
a = /* some thing */  // Not valid
1 голос
/ 27 августа 2011

Значение l-value имеет смысл в левой части задания.Все l-values также r-values.Нужна ли память или нет, имеет мало общего с тем, что l-value.Еще важнее то, оценивает ли он область памяти, где что-то может быть сохранено.

int  x = 3;

x+5 = 7;    // error

Выражение x+5 не является l-value.

0 голосов
/ 27 августа 2011

Для ясности: во-первых, int x не резервирует место для переменной, он просто уведомляет компилятор о переменной.Пространство зарезервировано и назначено, когда ему присвоено значение, т.е. когда мы делаем x=5;.

Теперь вопрос L-Value и R-Value:

L-ValueЭто то, что может быть присвоено постоянное значение.Итак, да x является L-значением.Потому что мы можем сделать x=5;.Но &x не является L-значением, поскольку мы не можем &x=5;.Точно так же 0xyyyy является адресом и может быть R-значением, но его нельзя назначить, поэтому это не L-значение.

0 голосов
/ 27 августа 2011

Вы, ребята, правы, но я думаю, что вопрос ОП может быть немного больше.Это тоже что-то, что меня беспокоило.

, поэтому

int x;

Теперь x - это lvalue.Но что именно x ?Это место в памяти, где вы можете хранить вещи?Но подождите ... это будет &x, что не является lvalue.

Другая странная вещь заключается в том, что x даже не должно иметь места в памяти.Компилятор может решить оставить его в реестре все время. Теперь что делает его lvalue?

Я думаю, что лучший способ подвести итог, это то, что lvalue - это концепция, используемая компилятором, но она не отображается во время выполнения.x может быть lvalue, потому что компилятор знает, что может

store $x %ax

(я создаю синтаксис сборки; было слишком долго)

Или, возможно, он находится в регистре и знает, что

move %bx %ax

По сути, это lvalue, потому что компилятор знает, как сохранить что-то в «нем», но вы не можете ухватиться за это «это».

...