Поделиться через


Выражения L-Value и R-Value

Выражения, которые ссылаются на адреса памяти, называются выражениями l-значения. L-значение представляет значение locator или left области хранения, что означает, что оно может отображаться слева от знака равенства ( = ). L-значения часто являются идентификаторами.

Выражения, ссылающиеся на изменяемые расположения, называются "изменяемыми l-значениями". Изменяемое l-значение не может иметь тип массива, неполный тип или тип с атрибутом const . Чтобы структуры и объединения были изменяемыми l-значениями, они не должны содержать элементы с атрибутом const . Имя идентификатора обозначает место хранения, а значение переменной является значением, хранящимся в этом месте.

Идентификатор является изменяемым l-значением, если он ссылается на адрес памяти и если он принадлежит арифметическому типу, типу структуры, объединения или указателя. Например, если ptr — указатель на область хранения, то *ptr будет изменяемым l-значением, которое обозначает область хранения, на которую указывает ptr.

Любое из следующих выражений C может быть выражением l-значения.

  • Идентификатор целочисленного типа, типа указателя, структуры или объединения.

  • Выражение подстрочного индекса ([ ]), которое не вычисляет массив

  • Выражение выбора элемента (-> или .)

  • Выражение унарного косвенного обращения (*), которое не ссылается на массив

  • Выражение l-значения в скобках.

  • Объект const (неизменяемое l-значение).

Термин "r-значение" иногда используется, чтобы описать значение выражения и отличить его от l-значения. Все l-значения являются r-значениями, но не все r-значения являются l-значениями.

Блок, относящийся только к системам Microsoft

Microsoft C включает расширение стандарта ANSI C, которое позволяет использовать приведения l-значений в качестве l-значений до тех пор, пока размер объекта не удлиняется с помощью приведения. (Дополнительные сведения см. в разделе Преобразования приведения типов.) В следующем примере показана эта функция:

char *p ;
short  i;
long l;

(long *) p = &l ;       /* Legal cast   */
(long) i = l ;          /* Illegal cast */

В Microsoft C расширения Microsoft по умолчанию включены. Используйте параметр компилятора /Za для отключения этих расширений.

Завершение блока, относящегося только к системам Майкрософт

См. также

Операнды и выражения