*p++与(*p)++与*(p++
来源:互联网 发布:mac文件保存哪里好 编辑:程序博客网 时间:2024/04/29 09:40
*p++与(*p)++与*(p++
这个问题其实是论述*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);
}
运行结果:
剩下的工作就是你自己慢慢体会了。
- *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[ ]的区别
- 创建和使用Qt插件的简单例子
- eclipse 导入项目乱码问题
- setjump和longjump
- Cookie的实例应用
- WPF重写ListBox的item
- *p++与(*p)++与*(p++
- 关闭Andorid后台流量
- 多线程编程中遇到的问题——undefined reference to 'pthread_create'
- Android获取手机和系统版本等信息的代码
- 搜寻引擎优化能够分为三个阶段
- strcpy和strncpy区别
- 巴塞罗那VB2011大会
- 设计模式之---观察者模式
- How to call Visual Basic .NET run-time library members from Visual C#