繁体   English   中英

包含前/后增量和指针的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。

是ideone链接。

*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)。

通常,理解此类问题的关键是了解运算符的优先级和关联性,并结合仔细阅读代码来应用该知识。 在此特定情况下,陷阱是步骤3,其中仅取消引用ptr ,而不增加ptr

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM