understack
understack

Reputation: 11580

Explanation of ++val++ and ++*p++ in C

int val = 5;

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

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

Could someone explain these 2 cases? Thanks.

Upvotes: 5

Views: 6032

Answers (4)

Guffa
Guffa

Reputation: 700302

The expression ++val++ is the same as (++val)++ (or perhaps ++(val++), anyway it's not very relevant). The result of the ++ operator is not the variable, but the value, and you can't apply the operator to a value.

The expression ++*p++ is the same as ++(*(p++)). The result of p++ is the value, but the result of *(p++) is a memory location, which the ++ operator can be applied to.

Upvotes: 3

sepp2k
sepp2k

Reputation: 370122

++val++ is the same as ++(val++). Since the result of val++ is not an lvalue, this is illegal. And as Stephen Canon pointed out, if the result of val++ were an lvalue, ++(val++) would be undefined behavior as there is no sequence point between the ++s.

++*p++ is the same as ++(*(p++)). Since the result of *(p++) is an lvalue, this is legal.

Upvotes: 26

sled
sled

Reputation: 14625

also note that you're changing the address of the pointer by

int k = ++*p++;

Upvotes: 1

Prasoon Saurav
Prasoon Saurav

Reputation: 92864

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

That because you cannot pre-increment an rvalue. ++val++ is interpreted as ++(val++) because post-increment operator has higher precedence than pre-increment operator. val++ returns an rvalue and pre-increment operator requires its operand to be an lvalue. :)

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

++*p++ is interpreted as ++(*(p++)), which is perfectly valid.

Upvotes: 0

Related Questions