Являются ли буквальные строки и возвращаемые значения функции значениями или значениями? - PullRequest
30 голосов
/ 10 января 2010
  1. Интересно, является ли буквальная строка lvalue или rvalue. Являются ли другие литералы (например, int, float, char и т. Д.) Lvalue или rvalue?

  2. Является ли возвращаемое значение функции lvalue или rvalue?

Как вы различаете разницу?

Ответы [ 3 ]

40 голосов
/ 10 января 2010
  1. строковые литералы являются lvalues, но вы не можете их изменить
  2. rvalue, но если это указатель и не NULL, объект, на который он указывает, является lvalue

Стандарт C признает, что исходные термины означали слева и справа , как в L = R; тем не менее, он говорит о том, что lvalue следует понимать как значение локатора , что примерно означает, что вы можете получить адрес объекта и, следовательно, этот объект имеет местоположение. (См. 6.3.2.1 в C99 .)

К тому же, стандарт отказался от термина rvalue и просто использует «значение выражения», которое представляет собой практически все, включая литералы, такие как int, char, float и т.д. с rvalue можно сделать и с lvalue, так что вы можете думать обо всех lvalue как о rvalue.

4 голосов
/ 07 февраля 2013

В C есть два вида выражений: 1. lvalue: выражение, которое является lvalue, может отображаться как слева или справа от присваивания. 2. rvalue: выражение, являющееся rvalue, может появляться справа, но не слева от присваивания. Переменные являются lvalues ​​и могут отображаться в левой части назначения. Числовые литералы являются r-значениями и поэтому не могут быть назначены и не могут отображаться слева. Следующее является действительным утверждением: int g = 20; Но следующее не является допустимым утверждением и приведет к ошибке времени компиляции: 10 = 20;

1 голос
/ 25 мая 2011

есть определение для C ++ от Microsoft. По этому определению буквенная строка, скажем «привет мир», является lvalue, потому что она постоянная, а не временная. На самом деле это сохраняется в течение всего срока службы вашего приложения.

...