为什么编译器不生成错误 "lvalue required"?
Why isn't the compiler generating an error "lvalue required"?
根据我的理解,在下面代码中标记为 'line 2' 的行中,表达式 (*ptr)++
应该生成 "lvalue required" 错误,因为 *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
}
你误会了。 (*ptr)
的结果是 左值,可以在其上应用 post 增量运算符。
所以,在你的情况下,
printf("%d ", (*ptr)++); //line 2
很好。
引用C11
标准,第§6.5.3.2章,地址和间接运算符,(强调我的)
The unary *
operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object.
FWIW,如果 *ptr
不是左值,你也会在写 *ptr = 5
之类的东西时出错,不是吗?
#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;
}
那int i = 0; i++;
呢。如果 i
为 0,那么 0++
有效吗?答案当然是否定的,0++
(和1++
)是无效的。 ++
未应用于 值 ,它应用于 对象 (在本例中为 i
,或者在您的case, *ptr
).
指向的对象
左值是指内存中某个地方 can/does 持有 value.So if *ptr=10;
then *ptr
is lvalue
.
根据我的理解,在下面代码中标记为 'line 2' 的行中,表达式 (*ptr)++
应该生成 "lvalue required" 错误,因为 *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
}
你误会了。 (*ptr)
的结果是 左值,可以在其上应用 post 增量运算符。
所以,在你的情况下,
printf("%d ", (*ptr)++); //line 2
很好。
引用C11
标准,第§6.5.3.2章,地址和间接运算符,(强调我的)
The unary
*
operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object.
FWIW,如果 *ptr
不是左值,你也会在写 *ptr = 5
之类的东西时出错,不是吗?
#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;
}
那int i = 0; i++;
呢。如果 i
为 0,那么 0++
有效吗?答案当然是否定的,0++
(和1++
)是无效的。 ++
未应用于 值 ,它应用于 对象 (在本例中为 i
,或者在您的case, *ptr
).
左值是指内存中某个地方 can/does 持有 value.So if *ptr=10;
then *ptr
is lvalue
.