*p++與(*p)++與*(p++)

原文: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);
}
運行結果是:
程序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);
}
運行結果
程序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);
}
運行結果:
程序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);
}
運行結果:
程序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++
(*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);
}
運行結果:
剩下的工作就是你自己慢慢體會了。

發佈了12 篇原創文章 · 獲贊 21 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章