这个问题其实是论述*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);
}
运行结果:
剩下的工作就是你自己慢慢体会了。