*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);
}
运行结果是:
*p++与(*p)++与*(p++)_第1张图片
程序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);
}
运行结果
*p++与(*p)++与*(p++)_第2张图片
程序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);
}
运行结果:
*p++与(*p)++与*(p++)_第3张图片
程序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);
}
运行结果: *p++与(*p)++与*(p++)_第4张图片
程序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++)_第5张图片 

综上所述:
*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++)_第6张图片
剩下的工作就是你自己慢慢体会了。

你可能感兴趣的:(工作)