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

xiaoxiao2021-02-27  190

*p++与(*p)++与*(p++)(转)http://blog.csdn.net/primeprime/article/details/51131353

转自: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); } 运行结果: 剩下的工作就是你自己慢慢体会了。 *p++与(*p)++与*(p++) 顶 0 踩 0     上一篇Linux下添加FTP账号和服务器、增加密码和用户,更改FTP目录(转)下一篇DNS协议详解

  相关文章推荐 • 从零开始学习音视频编程技术(十五) YUV420P转RGB32 • [转]c3p0详细配置 • Codevs_P1743 反转卡片(块状链表+SplayTree) • powerbuilder P-code 中的JP跳转指令的反向工程 • P1756 数字反转 • ESFramework Demo -- P2P通信Demo(附源码) • lg P1553 数字反转(升级版) • 利用ov511的webeye v2000摄像头实现YUV420P格式转RGB24格式来抓取一张图片 • spring 三章 依赖注入与控制反转(2008年10月29日 星期三 05:42 P.M. 搬) • char p转CString str
转载请注明原文地址: https://www.6miu.com/read-12845.html

最新回复(0)