涉及 pre/post 增量和指针的 C 程序的输出

Output of C program involving pre/post increment and pointer

我正在解决猜测以下 C 代码的输出 测验,但我没有得到以下一个的输出:

(在 printf 之后的评论中,我写了我认为该行已执行的执行顺序以及让我感到困惑的地方)

    int i;
    int *ptr = (int *) malloc(5 * sizeof(int));
    int *ptr2 = ptr;
    int *ptr3 = ptr;

    for (i=0; i<5; i++)
    {
        *(ptr + i) = i;
    }
    printf("%d ", *ptr++);   //*ptr evaluated to 0, print 0, increment ptr 
    printf("%d ", (*ptr)++); //*ptr evaluated to 1, print 1, increment ptr
    printf("%d ", *ptr);     //*ptr evaluated to 2, print 2
    printf("%d ", *++ptr);   //increment ptr, *ptr evaluated to 3, print 3 (but in actual it prints 2, why?)
    printf("%d ", ++*ptr);   //*ptr evaluated to 3, increment 3, print 4 (but in actual it prints 3, why?)

输出

0 1 2 2 3

为什么最后两个整数 2 和 3?我觉得他们应该是3和4。

Here 是 ideone link.

printf("%d ", *ptr);     //*ptr evaluated to 2, print 2

您实际上是在指向数组的第二个值,它的值为 1,直到您在上一行增加它

*ptr++

递增 ptr 然后取消引用 ptr 的先前值,产生 ptr[0] (0).

(*ptr)++

取消引用 ptr 然后增加存储在那里的值,产生 ptr[1] (1)(但保留为 2)。

*ptr

取消引用指针,产生 ptr[1] (2) 因为我们还没有继续前进。

*++ptr

递增 ptr 并取消引用 ptr 的新值,产生 ptr[2] (2).

++*ptr

取消引用 ptr 并增加存储的值,产生 ptr[2] (3)。

一般来说,理解此类问题的关键是了解 operator precedence and associativity 并将这些知识与 仔细 阅读代码相结合。在这种特定情况下,陷阱是第 3 步,其中 ptr 仅被取消引用而不是递增。