C语言中++ val ++和++ * p ++的解释

int val = 5; printf("%d",++val++); //gives compilation error : '++' needs l-value int *p = &val; printf("%d",++*p++); //no error 

有人可以解释这2个案例吗? 谢谢。

++val++++(val++) 。 由于val++的结果不是左值,这是非法的。 正如Stephen Canon指出的那样,如果val++的结果是左值,则++(val++)将是未定义的行为,因为++ s之间没有序列点。

++*p++++(*(p++)) 。 由于*(p++)的结果左值,这是合法的。

表达式++val++(++val)++ (或者也许是++(val++) ,无论如何它都不是很相关。 ++运算符的结果不是变量,而是值,并且您不能将运算符应用于值。

表达式++*p++++(*(p++))p++的结果是值,但*(p++)的结果是一个内存位置,可以应用++运算符。

还要注意你要改变指针的地址

 int k = ++*p++; 

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

那是因为你不能预先增加一个rvalue++val++被解释为++(val++)因为后增量运算符的优先级高于预增量运算符。 val++返回一个rvalue而pre-increment运算符要求其操作数为lvalue 。 🙂

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

++*p++被解释为++(*(p++)) ,这是完全有效的。