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

转载 2016年06月01日 20:25:21

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);
}
运行结果:
剩下的工作就是你自己慢慢体会了。

相关文章推荐

【P2P网络】BitTorrent的DHT协议(译自官方版本)

译者前序 DHT协议早在2005年就已经成为了官方BitTorrent协议的一部份,但是我竟然一直没有找到国内的官方翻译稿,所以将其进行翻译,若文中错误,欢迎各位指正。 其次,若想彻底理解DHT协...

JEECG-P3开发专题 - 开发环境搭建入门

官方标准开发工具:1 .IDE    Eclipse Java EE IDE for Web Developers.    Version: Mars.2 Release (4.5.2)    Bui...

AllJoyn:高通推出的近距离P2P通讯技术

以NFC为代表的近距离无线通讯技术已经不是什么新鲜玩意了,而近场通讯的实用性和便利性,也使其成为业界一大热点,众多顶级公司都对这项技术寄予厚望,连全球最大的手机芯片制造商高通也推出了近距离P2P通讯技...

C3P0连接池配置和实现详解

C3P0连接池配置和实现详解 一、C3P0配置 c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一...
  • pplsunny
  • pplsunny
  • 2016年11月19日 16:30
  • 12076

计算复杂度:P、NP、NP 完备

P 指的是用计算机能很快求解的问题; NP 指的是我们想找到最优解的问题; P = NP,P ≠ NP...

tyvj P1179 飘飘乎居士数列游戏

来自本人百度空间 2010-10-24 19:17 帮zhanglunAC一题绿的,,然后自己卡了个第10,,庆祝一下。。 感谢CCTV,MTV,连云港TV。。。。。 最后还要感谢飘飘大...

P2P风控措施和风控流程

P2P是一种跳过银行间接贷款融资模式的一种在借款人和出借人之间直接发生借贷关系的业务模式,那么理解P2P的风险是什么就很简单,就是借款人不能偿还借款的风险。...

C3P0官方对于MySQL8小时问题的解决方案

前一段时间在做一个发邮件的程序,程序是用定时器,每晚凌晨定时发邮件,邮件内容需要从数据库中获取,运行了一天就出问题了。问题信息如下com.mysql.jdbc.exceptions.jdbc4.Com...

802.1p 802.1q是什么协议

一、802.1Q协议 802.1Q协议,即Virtual Bridged Local Area Networks协议,主要规定了VLAN的实现,下面我们首先讲述一下有关VLAN的基本观念。 二、...

C3P0的三种配置方式以及基本配置项详解

c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:*p++与(*p)++与*(p++)
举报原因:
原因补充:

(最多只允许输入30个字)