Printf在连续调用中以不同方式打印相同的变量值,而不在其间进行任何操作

时间:2013-12-06 10:49:16

标签: c printf

#include<stdio.h>
#include<conio.h>
int main()
//program start here
{

int i= 655535;
int *p =&i;
printf("p:%d \n*p:%d \n",p,*p);
printf("*p++:%d \n p:%d \n *p:%d \n ++(*p):%d \n p:%d \n",*p++, p,*p, ++*p,p);
printf("p:%d\n", p);
getch();
}

输出:

p:2293620
*p:655535
*p++:655536
p:2293620
*p:655536
++(*p):655536
p:2293620
p:2293624

为什么上述程序打印的最后'p'值不同?

3 个答案:

答案 0 :(得分:5)

*p++

相当于:

*(p++)

所以这会改变p

您的程序调用未定义的行为,因为它修改并访问序列点之间的p*p,以及第二个printf参数列表中的所有增量和访问。在您使用的实现中,所有p访问都在增量之前完成,它会打印未修改的值。但是,*p在增量之后完成,因此它会打印修改后的值。

答案 1 :(得分:1)

发送到函数调用的参数以相反的顺序被压入堆栈中,因此当它弹出值以按正确的顺序获取它们时

在你的情况下:

printf("*p++:%d \n p:%d \n *p:%d \n ++(*p):%d \n p:%d \n",*p++, p,*p, ++*p,p);

将执行以下步骤:

1)推p - &gt; p:2293620

2)推++*p - &gt; ++(*p):655536

3)推*p - &gt; *p:655536

4)推p - &gt; p:2293620

5)推送*p++*(p++)相同 - &gt; * p ++:655536 //后增量操作仅在下一次打印时可见,并且您还使用sizeof(int)增加指针

这解释了为什么p

有不同的值

例如,对于以下代码段:

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 10;
    printf("%d %d %d\n", a++, a++, a++);
    return 0;
}

您将获得以下输出:

12 11 10

答案 2 :(得分:0)

你有一个

  

*(p ++)== * p ++

在这一行:

  

printf(“* p ++:%d \ np:%d \ n * p:%d \ n ++(* p):%d \ np:%d \ n”,* p ++,p,* p ,   ++ * P,P);

printf 调用返回后,p指向的地址将以 sizeof(int)* 1 递增。 所以p的最终值是 2293620 + 4 * 1 = 2293624