为什么编译器不会产生错误"左值需要"?

时间:2015-07-14 06:14:36

标签: c pointers lvalue

根据我的理解,在标记为'第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
}

4 个答案:

答案 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;然后*ptrlvalue

答案 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;
}