*p++与(*p)++与*(p++)
来源:互联网 发布:卡祖笛 淘宝 编辑:程序博客网 时间:2024/04/29 11:30
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
void main()
{
int a=2;
printf("a++=%d,++a=%d,a++=%d ",a++,++a,a++);
printf("a=%d ",a);
}
运行结果:
剩下的工作就是你自己慢慢体会了。
0 0
- *p++与*(p++) (*p)++ *++p *(++p)
- *p++与(*p)++与*(p++)
- *p++与(*p)++与*(p++
- *p++与(*p)++与*(p++)
- *p++与(*p)++与*(p++)
- *p++与(*p)++与*(p++)
- *p++与(*p)++与*(p++)
- *p++与(*p)++与*(p++)
- *p 与**p 参数
- *p++与(*p)++
- *(p++)与*p++
- (*p)++与*p++
- *p++与++*p
- *p++与(*p)++与*(p++)(转)
- char (*p)[]与char *p[]
- p[]与*p的不同之处
- char *p与char p[]
- (*p)[ ] 与*p[ ]的区别
- C#之三十九 抽象工厂模式
- ASP常用代码段
- TimePickerDialog样式配置与TimePicker模式选择
- [bzoj1455]罗马游戏
- 安卓xml使用第三方框架Xstream解析
- *p++与(*p)++与*(p++)
- VIM命令
- 高并发java
- MySQL索引原理及慢查询优化
- Bootstrap基础---网格系统
- 前端构建工具gulpjs的使用介绍及技巧
- Myeclipse 修改jsp项目要重新部署的解决办法
- 字符串编程之与整数的互换
- Could not generate DH keypair(httpclient)