[問題] 指標 ++p & p++ 結果不如預期

看板C_and_CPP作者 (New)時間11年前 (2013/05/10 18:00), 編輯推噓8(8018)
留言26則, 11人參與, 最新討論串1/1
題目: int a[5]={1,2,3,4,5}; int *p=a; *(p++)+=123; *(++p)+=123; 請問a陣列的每個值為何? 自己打的程式碼: #include <stdio.h> #include <stdlib.h> int main() { int a[5]={1,2,3,4,5}; int *p=a; printf( "a[0]的位置%p\n",&a[0]); printf( "a[1]的位置%p\n",&a[1]); printf( "a[2]的位置%p\n",&a[2]); printf( "a[3]的位置%p\n",&a[3]); printf( "a[4]的位置%p\n",&a[4]); printf( "p=%p\n",p); printf( "*p=%d\n",*p); printf("===========================================\n"); *(p++)+=123; printf( "p=%p\n",p); printf( "*p=%d\n",*p); printf( "a[0]的值為%d \n",a[0]); printf( "a[1]的值為%d \n",a[1]); printf( "a[2]的值為%d\n",a[2]); printf( "a[3]的值為%d\n",a[3]); printf( "a[4]的值為%d\n",a[4]); printf("===========================================\n"); *(++p)+=123; printf( "p=%p\n",p); printf( "*p=%d\n",*p); printf( "a[0]的值為%d\n",a[0]); printf( "a[1]的值為%d\n",a[1]); printf( "a[2]的值為%d\n",a[2]); printf( "a[3]的值為%d\n",a[3]); printf( "a[4]的值為%d\n",a[4]); system("pause"); return 0; } 結果:http://imgur.com/7N86Gal
我的疑問: 為什麼結果a[0]會加123, 而不是a[1]加123 ? 我以為結果應該是a[5]={1,125,126,4,5} 卻錯了 想不通為什麼,有人可以幫我解釋一下嗎 謝謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.253.113.160

05/10 18:21, , 1F
差別在p++跟++p.
05/10 18:21, 1F

05/10 18:23, , 2F
p++是先做再加, ++p是先加在做
05/10 18:23, 2F

05/10 18:35, , 3F
還是蠻疑惑的 *(p++)+=123 是先讓p變成a[1]的位置 不對嗎
05/10 18:35, 3F

05/10 18:43, , 4F
*(p++)+=123 = *(p)+=123 再做 p++
05/10 18:43, 4F

05/10 18:44, , 5F
感覺好像跟你電腦一次讀幾個位元有關
05/10 18:44, 5F

05/10 18:45, , 6F
先把a[0]做運算 再把指標指向[1]
05/10 18:45, 6F

05/10 18:46, , 7F
少複製了一頁 我弄錯了 XD
05/10 18:46, 7F

05/10 18:58, , 8F
我知道a大的意思了 可是刮號內不是要先做嗎
05/10 18:58, 8F

05/10 20:23, , 9F
05/10 20:23, 9F

05/10 20:24, , 10F
第9行 temp[0]=(i++);
05/10 20:24, 10F

05/10 20:25, , 11F
實際上組語直接搬i值給temp[0]
05/10 20:25, 11F

05/10 20:25, , 12F
但第10行 temp[1]=(++j);
05/10 20:25, 12F

05/10 20:26, , 13F
組語就先將j值+1 在搬給temp[1]
05/10 20:26, 13F

05/10 22:28, , 14F
*() 是黏在一起的吧 只是代表它是一個值
05/10 22:28, 14F

05/10 22:42, , 15F
可以把*(p++)當成b 則變成 b+=123 就可以做運算了
05/10 22:42, 15F

05/10 22:42, , 16F
至於先做再加 還是先加再做則要看b裡面的內容了
05/10 22:42, 16F

05/10 22:59, , 17F
goIT大 妳是甚麼軟體可以把C CODE轉組語阿 叫我用 >"<
05/10 22:59, 17F

05/10 23:09, , 18F
就compiler啊
05/10 23:09, 18F

05/10 23:22, , 19F
謝謝Golt大和a大解說 :D
05/10 23:22, 19F

05/10 23:37, , 20F
邊義氣哪裡可以設定編完可以看編成的組語呢
05/10 23:37, 20F

05/11 17:30, , 21F
真的會有這種題目喔...好複雜...
05/11 17:30, 21F

05/11 18:59, , 22F
這萬年面試題目啦XDD
05/11 18:59, 22F

05/12 09:41, , 23F
gcc編成組語是加 -S 吧 VC我要去查
05/12 09:41, 23F

05/12 12:40, , 24F
弄懂得話蠻簡單的 版上討論過很多次了 很多高手解釋過
05/12 12:40, 24F

05/13 01:41, , 25F
面試題目最喜歡考linkedlist跟這個p++ ++p了
05/13 01:41, 25F

05/17 22:41, , 26F
p+=p+++p;
05/17 22:41, 26F
文章代碼(AID): #1HZCKvP_ (C_and_CPP)