根据我的理解,在标记为'第2行'的行中在下面的代码中,表达式(*ptr)++
应该生成"所需的左值"错误,因为*ptr
评估为i=1
的常量值,而不是左值?
为什么该计划成功运作?或者我的概念出错了?如果是的话,请赐教。
int main(void)
{
int i;
int *ptr = (int *) malloc(5 * sizeof(int));
for (i=0; i<5; i++)
*(ptr + i) = i;
printf("%d ", *ptr++); //line 1
printf("%d ", (*ptr)++); //line 2
printf("%d ", *ptr); //line 3
printf("%d ", *++ptr); //line 4
printf("%d ", ++*ptr); //line 5
}
答案 0 :(得分:6)
你有一种误解。 (*ptr)
的结果是左值,可以应用后增量运算符。
所以,在你的情况下,
printf("%d ", (*ptr)++); //line 2
很好。
引用C11
标准,章节§6.5.3.2,地址和间接操作符,(强调我的)
一元
*
运算符表示间接。如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值。
FWIW,如果*ptr
不是左值,那么写*ptr = 5
之类的内容也会出错,不是吗?
答案 1 :(得分:1)
int i = 0; i++;
怎么样?如果i
为0,那么0++
是否有效?答案当然是否定的,0++
(和1++
)无效。 ++
未应用于值,它已应用于对象(在本例中为i
,或者在您的情况下,指向的对象*ptr
)。
答案 2 :(得分:1)
左值是指内存中可以/确实存在值的某个位置。所以*ptr=10;
然后*ptr
是lvalue
。
答案 3 :(得分:0)
#include <stdio.h>
int main(void) {
int i = 42;
int *ptr = &i; /* ptr points to i */
(*ptr)++; /* you increment the pointed value */
printf("%d", i); /* and there is a proof: 43 is displayed */
return 0;
}