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

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

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

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


person Mrityu    schedule 29.05.2020    source источник
comment
lvalue — это нечто (адрес), которому может быть присвоено значение (присвоение). При увеличении lvalue обычно увеличивается адрес, которому присваивается rvalue.   -  person Paul Ogilvie    schedule 29.05.2020
comment
Возможно, вы сможете получить более полезные ответы, показывающие небольшой фрагмент кода. Мне немного сложно определить, о чем вы спрашиваете.   -  person Thomas Jager    schedule 29.05.2020


Ответы (2)


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

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

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

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

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

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

Это все равно, что написать

++3;

вместо

int x = 3;
++x;
person Vlad from Moscow    schedule 29.05.2020

В соответствии со стандартом C11 (ISO-IEC-9899-2011) -- 6.3.2.1 Lvalues, массивы и указатели функций: HTML_версия pdf_версия

За исключением случаев, когда это операнд оператора 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
person SleepyHead    schedule 20.07.2020