int val = 5;
printf("%d",++val++); //gives compilation error : '++' needs l-value
int *p = &val;
printf("%d",++*p++); //no error
有人可以解释这两种情况吗?谢谢。
int val = 5;
printf("%d",++val++); //gives compilation error : '++' needs l-value
int *p = &val;
printf("%d",++*p++); //no error
有人可以解释这两种情况吗?谢谢。
++val++
是一样的++(val++)
。由于结果val++
不是左值,因此这是非法的。正如斯蒂芬佳能指出的那样,如果 的结果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
和预增量运算符要求它的操作数是一个lvalue
。:)
int k = ++*p++; //no error
++*p++
被解释为++(*(p++))
,这是完全有效的。