Объяснение ++ val ++ и ++ * p ++ в C - PullRequest
6 голосов
/ 07 сентября 2010
int val = 5;

printf("%d",++val++); //gives compilation error : '++' needs l-value

int *p = &val;
printf("%d",++*p++); //no error

Может ли кто-нибудь объяснить эти 2 случая? Благодаря.

Ответы [ 4 ]

27 голосов
/ 07 сентября 2010

++val++ совпадает с ++(val++).Поскольку результат val++ не является lvalue, это незаконно.И, как указал Стивен Кэнон, если бы val++ было lvalue, ++(val++) было бы неопределенным поведением, так как между ++ s не было бы точки последовательности.как ++(*(p++)).Поскольку результат *(p++) равен lvalue, это допустимо.

4 голосов
/ 07 сентября 2010

Выражение ++val++ совпадает с (++val)++ (или, возможно, ++(val++), в любом случае, оно не очень актуально).Результатом оператора ++ является не переменная, а значение, и вы не можете применить оператор к значению.

Выражение ++*p++ совпадает с ++(*(p++)).Результатом p++ является значение, но результатом *(p++) является область памяти, к которой может быть применен оператор ++.

1 голос
/ 07 сентября 2010

также обратите внимание, что вы меняете адрес указателя на

int k = ++*p++;
0 голосов
/ 07 сентября 2010

int j = ++val++; //gives compilation error

Это потому, что вы не можете предварительно увеличить rvalue. ++val++ интерпретируется как ++(val++), потому что оператор постинкремента имеет более высокий приоритет, чем оператор предварительного инкремента. val++ возвращает rvalue, а для оператора предварительного приращения требуется, чтобы его операнд был lvalue. :)

int k = ++*p++; //no error

++*p++ интерпретируется как ++(*(p++)), что совершенно правильно.

...