Значения в стандарте ISO C11 - PullRequest
0 голосов
/ 11 февраля 2019

§ 6.3.2.1:2 ISO / IEC 9899: 2011, то есть «стандарт ISO C11», гласит:

2 За исключением случаев, когда это операнд оператора sizeof,унарный оператор &, оператор ++, оператор -- или левый операнд оператора . или оператор присваивания, lvalue, у которого нет типа массива, преобразуется в значение, сохраненное вобозначенный объект (и больше не является lvalue);это называется преобразованием lvalue.Если lvalue имеет квалифицированный тип, значение имеет неквалифицированную версию типа lvalue;кроме того, если lvalue имеет атомарный тип, значение имеет неатомарную версию типа lvalue;в противном случае значение имеет тип lvalue.Если lvalue имеет неполный тип и не имеет типа массива, поведение не определено.Если lvalue обозначает объект с автоматической продолжительностью хранения, который мог быть объявлен с помощью класса хранения регистра (никогда не было взято его адрес), и этот объект не был инициализирован (не объявлен с помощью инициализатора и никакое присвоение ему не было выполнено до использования), поведение не определено.

Но не является ли разыменованный указатель также lvalue, как и сам указатель?Например, int *ptr; ptr = malloc(…); *ptr = 1

Так почему же не указан оператор * - или я что-то здесь путаю?

1 Ответ

0 голосов
/ 11 февраля 2019

Вам не хватает раздела 6.5.3.2p4, в котором обсуждается семантика оператора косвенности *:

Унарный оператор * обозначает косвенность.Если операнд указывает на функцию, результатом является обозначение функции; если он указывает на объект, результатом является lvalue, обозначающее объект. Если операнд имеет тип «указатель на тип», результат имеет тип «тип».Если указателю было присвоено недопустимое значение, поведение унарного оператора * не определено.

Сам оператор определен для получения lvalue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...