在这种情况下,为什么输出为“0”?

时间:2015-07-28 09:52:23

标签: c post-increment

#include <stdio.h>

int main(void)
{
    int i;
    int *p = (int *) malloc(5 * sizeof(int));

    for (i=0; i<10; i++)
        *(p + i) = i;

    printf("%d ", *p++);
    return 0;
}

所以,我运行了这段代码。现在我被告知Why won't the output be 4 in this case?(在接受的答案中)*p++将首先递增指针然后取消引用它。因此,在上面的代码中,指针不应该首先递增然后取消引用,因此输出应该是1?相反,输出结果为0。为什么呢?

4 个答案:

答案 0 :(得分:4)

你的优先顺序是正确的,但是让我们看一下postfix增量运算符属性,不管吗?

C11标准在章节§6.5.2.4中说明, Postfix递增和递减运算符

  

后缀++运算符的结果是操作数的值。作为副作用,操作数对象的值递增(即,值1适当的类型添加到它)。 [...]

因此,变量本身将体验增量的效果,但变量存在的语句(带有后缀增量)将利用现有的变量的值,而不是递增的值。增量将在稍后部分作为副作用执行。

答案 1 :(得分:3)

本声明

printf("%d ", *ptr++);

执行以下操作:

  1. 取消引用ptr,产生ptr[0]
  2. 的值
  3. 打印出int步骤1的评估结果为ptr[0]
  4. 增加ptr,使其指向ptr[1]
  5. 打印ptr[1]使用:

    printf("%d ", *++ptr);
    

答案 2 :(得分:1)

请注意,它是后增量。因此,后缀++运算符的返回值是操作数本身的值,然后作为副作用,操作数对象的值递增。

表达式*ptr++将是

  1. *ptr
  2. *ptr的值用作printf("%d ", *ptr);
  3. ptr = ptr + 1
  4. 这些表达式的输出可以通过以下方式理解:

      
        
    1. 前缀++ *的优先顺序相同。两者的相关性是从右到左
    2.   
    3. 后缀++的优先级高于*前缀++ 后缀++ 的相关性为从左到右
    4.         

      因此,在上面的代码中,不应该首先递增指针然后取消引用,因此输出应该是1?

    使用以下要求:

    printf("%d ", *++ptr);
    

答案 3 :(得分:0)

首先,您应该添加#include <stdlib.h>。其次,您应该更正代码int *p = (int *) malloc(10 * sizeof(int));。然后*p++代表1. printf *p; 2. p++。如果要获得值1,则应使用代码printf("%d ", *++p);。我希望这可以帮到你。