*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