以下C程序输出的解释是什么?

时间:2015-08-09 13:54:52

标签: c operators dereference postfix-operator prefix-operator

我在geeksquiz.com上遇到了以下代码,但无法理解如何在C中评估涉及前缀,后缀和解除引用运算符的表达式:

#include <stdio.h>
#include <malloc.h>
int main(void)
{
    int i;
    int *ptr = (int *) malloc(5 * sizeof(int));

    for (i=0; i<5; i++)
         *(ptr + i) = i;

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

输出为:

0 1 2 2 3

有人可以解释一下这是上述代码的输出吗?

1 个答案:

答案 0 :(得分:1)

可以找到C中运算符的优先级here

在您的示例中,优先级唯一重要的表达式是:

*ptr++

这里,后缀运算符++具有更高的优先级,因此它等同于

*(ptr++)

其余部分((*ptr)++*ptr*++ptr++*ptr不存在歧义。)您似乎对此前的语义感到困惑postfix ++运算符。请记住,有时你会增加指针,其他指的是它指向的东西。这就是:

printf("%d ", *ptr++);   // Increment pointer, de-reference old value: 0
printf("%d ", (*ptr)++); // De-reference pointer, increment, yield old value
                         // Evaluates to 1, sets *ptr to 2
printf("%d ", *ptr);     // De-reference ptr, yields 2 (see above)
printf("%d ", *++ptr);   // Increment ptr, de-reference: 2
printf("%d ", ++*ptr);   // De-reference (2), increment result: 3