为什么编译器不生成错误 "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.