*p++与(*p)++与*(p++)
来源:互联网 发布:python svd分解 编辑:程序博客网 时间:2024/04/27 15:11
原文: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[ ]的区别
- 使用sax解析xml文件
- 1015. Reversible Primes (20)
- 黑马程序员_IO(Java IO 的一般使用原则 )
- C库、系统调用
- Git 守护进程
- *p++与(*p)++与*(p++)
- Letter Combinations of a Phone Number
- iOS如何从一个Storyboard Push到另一个Storyboard
- java-reflect 常用方法说明及实例
- 饮食结构根据地域不同依然有大量的差异
- 异常
- Android Studio Gradle 多渠道打包
- 数字问题
- TopCoder SRM 644 Div2 Problem 500 - LostCharacter (贪心)