*p++与(*p)++与*(p++)

1 篇文章 0 订阅

原文:http://blog.csdn.net/niuyongjie/article/details/2490869


这个问题其实是论述*P++等价于(*p)++还是等价于*(p++)的问题,为了验证这个问题,我编写了下面的小程序(vc++6.0编译环境),作为验证
程序1
#include "stdio.h"
void  main()
{
    int a=2
;
    int *p=&
a;
    int *pold;//记录P指向的地址,为了作为比较使用

    pold= p;
    //-----------原来的信息

    printf("原来的a=%d " ,a);
    printf("原来的p=%x "
,p);
    printf("原来的pold=%x "
,pold);
    //----------进行变化

    printf("*p++的结果=%d,a的结果a=%d ",*p++ ,a);
    printf("地址变化的结果p-pold=%x ",p-
pold);
}
运行结果是:
程序2
#include "stdio.h"
void main()
{
     int a=2;
     int *p=&a;
     int *pold; // 记录P指向的地址,为了作为比较使用
    pold=p;
     // -----------原来的信息
    printf("原来的a=%d ",a);
    printf("原来的p=%x ",p);
    printf("原来的pold=%x ",pold);
     // ----------进行变化
    printf("(*p)++的结果=%d,a的结果a=%d ",(*p)++,a);
    printf("a的结果a=%d ",a);
    printf("地址变化的结果p-pold=%x ",p-pold);
}
运行结果
程序3
#include "stdio.h"
void main()
{
     int a=2;
     int *p=&a;
     int *pold; // 记录P指向的地址,为了作为比较使用
    pold=p;
     // -----------原来的信息
    printf("原来的a=%d ",a);
    printf("原来的p=%x ",p);
    printf("原来的pold=%x ",pold);
     // ----------进行变化
    printf("a=%d,(*p)++的结果=%d,a的结果a=%d ",a,(*p)++,a);
    printf("a的结果a=%d ",a);
    printf("地址变化的结果p-pold=%x ",p-pold);
}
运行结果:
程序4
#include "stdio.h"
void main()
{
     int a=2;
     int *p=&a;
     int *pold; // 记录P指向的地址,为了作为比较使用
    pold=p;
     // -----------原来的信息
    printf("原来的a=%d ",a);
    printf("原来的p=%x ",p);
    printf("原来的pold=%x ",pold);
     // ----------进行变化
    printf("*(p++)的结果=%d,a的结果a=%d ",*(p++),a);
    printf("a的结果a=%d ",a);
    printf("地址变化的结果p-pold=%x ",p-pold);
}
运行结果:
程序5
#include "stdio.h"
void main()
{
     int a=2,*p=&a,*q=&a;
    printf("%d %d  ",(*p),a);
    printf("%d %d %d ",*p++,(*p)++,*q++);
    printf("%d ",a); 
}

运行结果

程序6

#include "stdio.h"
void main()
{
     int a=2,*p=&a,*q=&a;
    printf("%d %d  ",(*p),a);
    printf("%d %d %d ",(*p)++,*p++,*q++);
    printf("%d ",a); 
}

运行结果:

程序7:

#include "stdio.h"
void main()
{
     int a=2,*p=&a,*q=&a;
    printf("%d %d  ",(*p),a);
    printf("%d %d %d %d ",(*p)++,*p++,*q++,a);
    printf("%d ",a); 
}

运行结果:

程序8:

#include "stdio.h"
void main()
{
     int a=2,*p=&a,*q=&a;
    printf("%d %d  ",(*p),a);
    printf("%d %d %d  ",*p++,(*p)++,*q++);
    p=&a;q=&a;
    printf("%d %d %d %d ",a,*p,(*q)++,a); 
    printf("%d %d %d  %d ",a,++(*p),++(*q),a); 
    printf("%d ",a);
    
}

运行结果: 

综上所述:
*p++是先取出*p的值,然后让p++
(*p)++是先取出*p的值,让这个值++
*(P++)是先取出*p的值,让p++
所以,*p++等价于*(P++)
而且printf的运行顺序是从右向左运行。而且++是在整个运算表达式运算完才进行,而且右++的执行顺序是从左到右进行。而左++遇到变量就会立即增加变量的值。
 
验证printf的运算顺序
#include "stdio.h"
void main()
{
     int a=2;
    printf("a++=%d,++a=%d,a++=%d ",a++,++a,a++);
    printf("a=%d ",a);
}
运行结果:
剩下的工作就是你自己慢慢体会了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值