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

前端 未结 4 1849
Happy的楠姐
Happy的楠姐 2021-01-02 23:07
int val = 5;

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

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

Could

相关标签:
4条回答
  • 2021-01-02 23:26

    ++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.

    0 讨论(0)
  • 2021-01-02 23:38

    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.

    0 讨论(0)
  • 2021-01-02 23:40

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

    int k = ++*p++;
    
    0 讨论(0)
  • 2021-01-02 23:43

    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.

    0 讨论(0)
提交回复
热议问题