轉自:http://www.cnblogs.com/IAmBetter/p/3175711.htmlhtml
環境:win7面試
編譯器:GCCubuntu
1.先說++i和i++的基礎數組
代碼以下:spa
#include <stdio.h> //just change simple void stop(void) { system("pause"); } int main(void) { int i = 1; printf("i++ = %d\n",i++); printf("i = %d\n",i); int j = 1; printf("++j = %d\n",++j); printf("j = %d\n",j); printf("i++ = : %d ++i = %d\n",i++,++i); printf("i = %d\n",i); printf("++j = : %d j++ = %d\n",++j,j++); printf("j = %d\n",j); stop(); return 0; }
運行結果:操作系統
i++ = 1 i = 2 ++j = 2 j = 2 i++ = : 3 ++i = 3 i = 4 ++j = : 4 j++ = 2 j = 4
在ubuntu中運行結果以下:指針
注意:code
1) i++只有遇到";"分號纔會影響i的值, i++輸出的值仍是1,i的值也是1htm
2) i通過分號以後,i=2,由於自增了blog
3) ++j無論遇到不遇到分號";"都會影響j值和++j值,因此J=2
4)j的值也是2
5) 根據編譯器的不一樣和操做系統的不一樣,printf計算方向也不一樣。在win7中printf是從右向左執行由於操做的是輸出棧!從右開始計算,先++i,再i++,因此輸出3 和3。但在Ubuntu中卻輸出不同的結果。因此,在實際應用中,不該該寫出這樣的代碼!!!
6)最後一個i++遇到了分號,因此i=4
7) 從右開始計算,j打印的結果仍是2,可是第二次取出來的值是3,因此++j=4
2.理清概念 *p++ 中 *和++的優先級
#include <stdio.h> //just change simple void stop(void) { system("pause"); } int main(void) { int i = 5; int *p; int v; p = &i; printf("1-p = %p\n",p); printf("1-*p = %d\n",*p); v = *p++; printf("v = %d\n",v); printf("2-p = %p\n",p); printf("1-*p = %d\n",*p); printf("i = %d\n",i); system("pause"); return 0; }
運行結果:
1-p = 0x7ffeb4672f80
1-*p = 5
v = 5
2-p = 0x7ffeb4672f84
1-*p = 5
i = 5
從結果來看++符號影響了p的值並無影響i的值,++的優先級要高於 指針*符號
再看例子
#include <stdio.h> //just change simple void stop(void) { system("pause"); } int main(void) { int i = 5; int *p; int v; p = &i; printf("1-p = %p\n",p); printf("1-*p = %d\n",*p); v = ++*p; printf("v = %d\n",v); printf("2-p = %p\n",p); printf("1-*p = %d\n",*p); printf("i = %d\n",i); system("pause"); return 0; }
運算結果:
1-p = 0x7ffe33f90ff0
1-*p = 5
v = 6
2-p = 0x7ffe33f90ff0
2-*p = 6
i = 6
怎麼++不影響p的值了?
再看例子
把 代碼稍微調整:v = *++p;
運算結果:
1-p = 0x7ffece92b660
1-*p = 5
v = 32766
2-p = 0x7ffece92b664
2-*p = 32766
i = 5
啊額,原來 * 和++優先級是同一級別,同一級別按照從右往左的順序計算。
下面是一條面試題:
#include <stdio.h> //just change simple void stop(void) { system("pause"); } int main(void) { int a[] = {1,2,3,4,5,6,7,8,9}; int *p = a; printf("*p = %d\n", *p); printf("*p++ = %d\n", *p++); printf("*(p++) = %d\n", *(p++)); printf("*p = %d\n", *p); printf("(*p)++ = %d\n",(*p)++); p += 3; printf("&a = %d\n", &a); printf("*p = %d,&a+3 = %d\n", *p, &a+3); return 0; }
運行結果:
*p = 1 *p++ = 1 *(p++) = 2 *p = 3 (*p)++ = 3 &a = -299729216 *p = 6,&a+3 = -299729108
注:
1)因爲++比*優先級高,因此printf("*(p++) = %d\n", *(p++));等同於printf("*p++ = %d\n", *p++);
2)解析&a+3:因爲數組a在初始化時定義數組長度爲9,即佔用內存空間sizeof(int)*9=4*9=36,而&a表明數組a首地址,+3表示指向數組第四行,
即&a+3 = a[0]地址+36*3=a[0]地址+108。
把上面代碼中數組和指針p的初始化改成:
char a[] = {1,2,3,4,5,6,7,8,9};
char *p = a;
運行結果:
*p = 1 *p++ = 1 *p = 2 *(p++) = 2 *p = 3 (*p)++ = 3 &a = -318663840 *p = 6,&a+3 = -318663813