6
int val = 5;

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

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

有人可以解释这两种情况吗?谢谢。

4

4 回答 4

27

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

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

于 2010-09-07T15:24:45.517 回答
4

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

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

于 2010-09-07T15:27:13.657 回答
1

另请注意,您正在通过以下方式更改指针的地址

int k = ++*p++;
于 2010-09-07T15:27:43.070 回答
0

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

那是因为你不能预先增加一个rvalue. ++val++被解释为++(val++)因为后自增运算符的优先级高于前自增运算符。val++返回一个rvalue和预增量运算符要求它的操作数是一个lvalue。:)

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

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

于 2010-09-07T15:25:20.077 回答