Лилированные строки и функции возвращают значения 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, а не временная. Фактически он сохраняется на протяжении всей вашей жизни приложения.