關於自增符的運算

首先,自增分爲前置和後置:++i和i++。
在單獨成式的情況下,兩者並沒有什麼區別,都是把i+1的值賦給i

但在表達式中,兩者有明顯的區別。
例如

    int i = 1, j = 1;
    int a, b;
    a = i++;
    b = ++j;

運行結果:a=1,b=2,i=2,j=2
可以看出,後置自增先以i的值完成表達式的運算再使i+1
前置自增先使i+1再以此時i的值完成表達式的運算。

這樣,便可以進一步探討取值運算符’*’與’++’之間結合的問題。

    int a[5] = {1,2,3,4,5};
    int *p = &a;
    printf("%d\n", *p++      );
    printf("%d\n", *(p++)    );
    printf("%d\n", *++p      );
    printf("%d\n", ++*p      );

運行結果是:
1
2
4
5

首先要明確:’*’與’++’的優先級是相同的,且結合方向是自右向左。
因此p++ =(p++)
++p=(++p)
++*p=++(*p)
在*(p++)中,由於後置的’++’在表達式計算完後生效,因此等效於先取*p,再讓指針p++,即指向下一個元素的地址。
在*(++p)中,前置的’++’先自增再參與運算,因此指針p先指向下一個位置再取指針所指向的值。
在++(*p)中,先取p指針指向的值,再使這個值+1。

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