C語言中指針和自增運算符結合時的運算順序問題

轉載自: http://blog.csdn.net/xingjiarong/article/details/47071225

在C語言中,當指針運算符和++或者–結合時很容易分不清運算順序,在這裏總結一下,下面一共分析6中組合: * p++,(* p)++,* (p++),++* p,++( * p), * (++p)。

先看段代碼以及輸出:

#include<stdio.h>
int main()
{
    int a[3]={1,3,5};
    int *p=a;
    printf("----------------1----------------\n");
    printf("%d\n",*p++);
    printf("%d\n",*p);
    int i;
    for(i=0;i<3;i++)
        printf("%d ",a[i]);
    printf("\n");
    printf("----------------2----------------\n");
    p=a;//reset data
    printf("%d\n",(*p)++);
    printf("%d\n",*p);
    for(i=0;i<3;i++)
        printf("%d ",a[i]);
    printf("\n");
    printf("----------------3----------------\n");
    a[0]=1;//reset data
    p=a;
    printf("%d\n",*(p++));
    printf("%d\n",*p);
    for(i=0;i<3;i++)
        printf("%d ",a[i]);
    printf("\n");
    printf("----------------4----------------\n");
    p=a;
    printf("%d\n",++*p);
    printf("%d\n",*p);
    for(i=0;i<3;i++)
        printf("%d ",a[i]);
    printf("\n");
    printf("----------------5----------------\n");
    p=a;
    a[0]=1;
    printf("%d\n",++(*p));
    printf("%d\n",*p);
    for(i=0;i<3;i++)
        printf("%d ",a[i]);
    printf("\n");
    printf("----------------6----------------\n");
    p=a;
    a[0]=1;
    printf("%d\n",*(++p));
    printf("%d\n",*p);
    for(i=0;i<3;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

輸出結果是這樣的: 
這裏寫圖片描述

第一組:*p++,它的運算順序是先返回 *p的值,然後p再++。 
第二組:(*p)++,他的運算順序是先返回 *p的值,然後 *p的值再++,這一點從運算後的數組a的值可以看出來。 
第三組:*(p++),運算順序是先返回 *p的值,然後p再++,也就是說它和 *p++的運算順序一樣。

這三組都是先返回 *p的值,區別就在於到底是p++還是 *p的值++。

第四組:++*p,先將 *p的值++,然後再返回 *p的值。 
第五組:++(*p),先將 *p的值++,然後再返回 *p的值,所以它和++ *p是一樣的。 
第六組: * (++p),先將p的值++,然後再返回 * p的值,和 *++p是等價的。

這三組的特點是最後都是返回 *p的值,不同點在於是 *p先++還是p++。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章