[問題] C語言指標問題

看板C_and_CPP作者 (完了)時間13年前 (2011/07/19 01:57), 編輯推噓7(7016)
留言23則, 8人參與, 最新討論串1/2 (看更多)
小弟本人是C的新手,有個題目搞不懂為什麼? 想請各位大大幫我做詳細解答 #include <stdio.h> #include <stdlib.h> int main() { int a[]={6,7,8,9,10}; int *ptr = a; *(ptr++)+=123; printf("*ptr=%d,*ptr++=%d\n",*ptr,*ptr++); system("pause"); return 0; } Ans:*ptr=8,*ptr++=7 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.227.69.246

07/19 02:06, , 1F
這個答案是錯的 ... 應該要送分
07/19 02:06, 1F

07/19 02:07, , 2F
undefined, evaluate的順序不一定要由右至左
07/19 02:07, 2F

07/19 02:08, , 3F
其實這個寫法結果是確定的, 因為 * 的優先度比 ++ 高
07/19 02:08, 3F

07/19 02:09, , 4F
7 7 ?
07/19 02:09, 4F

07/19 02:09, , 5F
所以不管如何印出來的值要一樣, 遞增是 printf 後的事
07/19 02:09, 5F

07/19 02:11, , 6F
我猜原本是想考參數推入 stack 的順序, 但 C 不知道有
07/19 02:11, 6F

07/19 02:11, , 7F
沒有明定這件事
07/19 02:11, 7F

07/19 02:13, , 8F
遞增不會在printf後吧
07/19 02:13, 8F

07/19 02:15, , 9F
這是未定義,但原因不是因為順序未指定,而是因為 ptr 有
07/19 02:15, 9F

07/19 02:15, , 10F
答案是我跑dev c++的結果
07/19 02:15, 10F

07/19 02:16, , 11F
一次存取並不是為了決定 ptr 的新值(C99 6.5,2)
07/19 02:16, 11F

07/19 02:16, , 12F
好像是喔 ... 我搞錯了 orz
07/19 02:16, 12F

07/19 02:19, , 13F
就像 a[i++] = i; 是未定義(右邊讀i不是為了計算新的i)
07/19 02:19, 13F

07/19 02:23, , 14F
07/19 02:23, 14F

07/19 02:35, , 15F
簡單解釋 http://goo.gl/MDuXQ
07/19 02:35, 15F

07/19 02:52, , 16F
也許我應該說,咬文嚼字的標準裡面是分開談這兩件事情的xD
07/19 02:52, 16F

07/19 02:53, , 17F
單純只是未指定的話,不會像未定義一樣可以引爆核彈 xD
07/19 02:53, 17F

07/19 03:10, , 18F
這討論板好多神人,看來要常常來膜拜一下=__=
07/19 03:10, 18F

07/19 23:49, , 19F
嘆為觀止的題目
07/19 23:49, 19F

07/20 13:50, , 20F
*(ptr++)+=123;這行基本上只做了ptr++這件事不是嗎?
07/20 13:50, 20F

07/20 13:51, , 21F
整行應該解釋為把123+7 assign給ptr++所提出來的值
07/20 13:51, 21F

07/20 13:52, , 22F
基本上這樣的用法應該是在int **ptr或int *ptr[]才有效
07/20 13:52, 22F

07/20 19:23, , 23F
樓上:我想大部分推文討論的是 printf 那一行 :)
07/20 19:23, 23F
文章代碼(AID): #1E97G6Zp (C_and_CPP)
文章代碼(AID): #1E97G6Zp (C_and_CPP)