Лилированные строки и функции возвращают значения lvalues ​​или rvalues?

  • Просто задайтесь вопросом, является ли буквальная строка lvalue или rvalue. Существуют ли другие литералы (например, int, float, char и т.д.) Lvalue или rvalue?

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

Как вы говорите разницу?

Ответ 1

  • строковые литералы являются lvalues, но вы не можете их изменить.
  • rvalue, но если это указатель и не-NULL, то объект, на который он указывает, равен lvalue

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

К тому же стандарт отказался от термина rvalue и просто использует "значение выражения", которое есть практически все, включая литералы, такие как ints, chars, floats и т.д. Кроме того, все, что вы можете сделать с rvalue можно сделать также с lvalue, так что вы можете считать все lvalues ​​как rvalues.

Ответ 2

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

Ответ 3

существует определение для С++ от Microsoft. По этому определению, буквальная строка, например "hello world", равна lvalue, потому что она const, а не временная. Фактически он сохраняется на протяжении всей вашей жизни приложения.