[問題] 陣列的指標+1怎麼不是下一格

看板C_and_CPP作者 (忍者好難養)時間12年前 (2011/12/12 19:07), 編輯推噓7(7017)
留言24則, 11人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 指標+1不是等於指向下一個位置嗎? 怎麼整個反過來印了...? 餵入的資料(Input): 預期的正確結果(Expected Output): 1 2 3 錯誤結果(Wrong Output): 3 2 1 程式碼(Code):(請善用置底文網頁, 記得排版) int array[4]={1,2,3,4}; int *p=&array; printf("%d %d %d",*p,*p++,*p++); 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.129.19.21

12/12 19:12, , 1F
十三誡之8
12/12 19:12, 1F

12/12 19:12, , 2F
函數的引數沒有保證執行順序,可能先從右邊先呼叫
12/12 19:12, 2F

12/12 19:13, , 3F
f(g(), h()); //g()和h()的執行順序也不保證
12/12 19:13, 3F

12/12 19:14, , 4F
最佳化可以決定選擇任何一種作法
12/12 19:14, 4F

12/12 19:15, , 5F
不過f一定要等g和h都算出才會執行,這一點有保證
12/12 19:15, 5F
感謝^^恍然大悟 ※ 編輯: asadman1523 來自: 140.129.19.21 (12/12 19:19)

12/12 23:18, , 6F
int *p = array;
12/12 23:18, 6F

12/12 23:27, , 7F
#1Em1oVzU 寫得很仔細,簡單來說這就是未定義行為
12/12 23:27, 7F

12/13 00:23, , 8F
一維數組加一 是跳過整個數組(在這是跳4(格)*4(字節) )
12/13 00:23, 8F

12/13 01:13, , 9F
你把*p++改成*p+i的形式就可以了
12/13 01:13, 9F

12/13 08:11, , 10F
沒開最佳化的話c++預設是由右到左PUSH
12/13 08:11, 10F

12/13 08:57, , 11F
+mythnc 在這情況下&array和array都decay到一樣的型態
12/13 08:57, 11F

12/13 08:58, , 12F
+elfkiller 有沒有開最佳化都一樣 C++標準未定義行為
12/13 08:58, 12F

12/13 09:46, , 13F
未定義就是未定義,怎麼能夠說是右到左...
12/13 09:46, 13F

12/13 10:26, , 14F
十三誡之8,c/c++為了速度,沒有強制規定由右到左運算
12/13 10:26, 14F

12/13 10:27, , 15F
乖一點,不要再誤用它,不然有一天這bug會讓你爆肝
12/13 10:27, 15F

12/13 10:33, , 16F
#1Em1oVzU 看這篇吧,LPH66大大都無奈了
12/13 10:33, 16F

12/13 20:33, , 17F
語意不清sorry, 我想說的是函數__stdcall是由右到左
12/13 20:33, 17F

12/13 22:18, , 18F
VC好像預設是cdecl, 小弟以為是看compiler設定或使用到
12/13 22:18, 18F

12/13 22:18, , 19F
API/LIB設定好的calling convention. 另外, CC裡push進
12/13 22:18, 19F

12/13 22:19, , 20F
stack的順序, 有規定剛好是參數evaluation的順序嗎??
12/13 22:19, 20F

12/14 02:54, , 21F
樓上VC預設是cdecl沒錯~~而且我記得好像是沒有規定push
12/14 02:54, 21F

12/14 02:54, , 22F
順序是evaluate的順序.
12/14 02:54, 22F

12/14 02:55, , 23F
事實上calling convention並不是C語言的一部分吧@
12/14 02:55, 23F

12/14 20:49, , 24F
沒有明文規定 不過為了handle不定參數函數一般會遵循
12/14 20:49, 24F
文章代碼(AID): #1EvU1kCd (C_and_CPP)
文章代碼(AID): #1EvU1kCd (C_and_CPP)