Стандарт C99 (6.3.2.1):
lvalue
- это выражение с типом объекта или с неполным типом, отличным от void;если lvalue
не обозначает объект при оценке, поведение не определено.Когда говорят, что объект имеет определенный тип, тип определяется lvalue
, используемым для обозначения объекта.Модифицируемая lvalue
- это lvalue
, которая не имеет типа массива, не имеет неполного типа, не имеет типа с константой, и, если это структура или объединение, не имеет какого-либо члена (включаярекурсивно, любой член или элемент всех содержащихся агрегатов или объединений) с константным типом.
Имя lvalue
происходит от выражения присваивания E1 = E2
, в котором левый операнд E1
равендолжен быть (модифицируемым) lvalue
.Возможно, это лучше рассматривать как представление объекта «значение локатора».То, что иногда называют rvalue
, в этом международном стандарте описывается как «значение выражения».
Другими словами, lvalue
- это то, что вы можете найти для возможного изменения.Модифицируемая lvalue
- это та, которую вы на самом деле можете изменять .
Например, оператор C:
x = 7;
действителен, поскольку x
это lvalue
.С другой стороны, утверждение:
14 = 7;
недопустимо, поскольку 14
является , а не чем-то, что можно найти для назначения.
Фрагмент:
const int x = 7;
фактически создает lvalue
с именем x
, даже если вам не разрешено его изменять (это не модифицируемое `lvalue).