В C для постфиксного и префиксного оператора операнд должен быть lvalue, так что же на самом деле lvalue означает для переменной-указателя в случае этих операторов? - PullRequest
0 голосов
/ 29 мая 2020

В C для оператора постфикса и префикса операнд должен иметь значение l, поэтому, если cp = & ch; и предположим, что адрес ch равен 1000, а адрес cp равен 5000, поэтому ++ cp должен быть 5001 или 1001?

Это сомнение возникает из-за того, что lvalue cp - это расположение cp (5000), а rvalue cp - это значение 5000, "то есть 1000". Итак, если оператор ++ работает с lvalue, тогда он должен увеличивать 5000, а не 1000 (потому что это rvalue)?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 июля 2020

Согласно стандарту C11 (ISO- IEC -9899-2011) - 6.3.2.1 Значения L, массивы и обозначения функций: HTML_version pdf_version

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

На самом деле, результатом оператора & является rvalue и результатом оператора * является lvalue , поэтому:

int *p1; //variable p1 is a lvalue
int num = 314; //variable num is a lvalue
p1 = # //num is still a lvalue, and keep it that way
int *p2 = p1 + 1; //p1 is still a lvalue, but will become a rvalue through lvalue conversion
0 голосов
/ 29 мая 2020

Если у вас есть, например, эти два объявления

char ch = 'A';
char *cp = &ch;

Тогда это выражение ++cp увеличивает значение, хранящееся в переменной cp. Значение - это адрес переменной ch Таким образом, после приращения значение, хранящееся в переменной cp, будет указывать на память, которая находится после памяти, занятой переменной ch.

Унарный оператор ++ может изменить значение выражения lvalue. Например, вы не можете писать

char ch = 'A';
`++&ch;`

, потому что выражение &ch дает значение адреса.

Это то же самое, что писать

++3;

вместо

int x = 3;
++x;
...