首先,自增分爲前置和後置:++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。