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

What is the explanation for the output of the following C program?

我在 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

有人可以解释一下上面代码的输出结果吗?

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

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

*ptr++

这里后缀运算符++的优先级更高,所以等价于

*(ptr++)

其余的((*ptr)++*ptr*++ptr++*ptr。)你似乎对pre的语义感到困惑- 和后缀 ++ 运算符。请记住,有时您会增加指针,而其他人则增加它指向的东西。这是发生了什么:

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