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

时间:2010-09-07 15:21:34

标签: c increment operator-precedence

int val = 5;

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

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

有人可以解释这两起案件吗?感谢。

4 个答案:

答案 0 :(得分:27)

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

另请注意,您正在通过

更改指针的地址
int k = ++*p++;

答案 3 :(得分:0)

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

那是因为你无法预先增加rvalue++val++被解释为++(val++),因为后增量运算符的优先级高于预增量运算符。 val++返回rvalue,预增量运算符要求其操作数为lvalue。 :)

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

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