看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev C++5.0 問題(Question): 小弟最近在學習指針的時候發生了運算子優先級的困擾... 程式碼如下 #include <stdio.h> #include <windows.h> int main(void) { int ar[6]={1,2,3,4,5,0}; int *ptr=ar; *ptr++; printf("%d\n",*p); printf("%p\n",p); system("pause"); } 疑惑出現*ptr++;這一段 我查書上有書說: 指針ptr先取值再自加的動作 不過也有書說 指針ptr先自加再取值的動作 神奇的是... 我查運算優先級資料 有後綴++優先於*的說法 也有後綴++與*同級的說法 還是這個問題是要看編譯器來決定? 煩請各位高手指點迷津 剛剛試了一下 *ptr++ 結果是2 記憶體是0022FEF8 *++ptr 結果是2 記憶體是0022FEF8 結果是一樣的 所以要如何解釋這兩個運作...越來越糊塗了 我在書上看到*(*zippo+2)+1 代表二維陣列[2][1]的值 感覺左邊不好理解啊.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.112.117.8 ※ 編輯: william6718 來自: 59.112.117.8 (04/17 21:38)
purpose:你查的資料不太正確吧,簡單的觀念是除了::以外,只要是 04/17 21:42
leiyan:我想總是要先存*ptr才能再接著做之後的動作 不管++在前還後 04/17 21:43
purpose:出現在右邊也就是像 [] () i++ 則其優先權一定最高 04/17 21:43
diabloevagto:http://ppt.cc/sYTA 04/17 21:51
※ 編輯: william6718 來自: 59.112.117.8 (04/17 22:08)
EdisonX:你怎麼試的po code 上來. 04/17 22:10
cobrasgo:老實說我超討厭這種寫法,多加括號是會怎樣… 04/17 22:11
william6718:就是把中間的*ptr++直接換成*++ptr 04/17 22:11
cobrasgo:另外原po可以用objdump來看compile後過的組語長怎樣 04/17 22:11
william6718:對不起啊= = 書上確實是這麼寫的 04/17 22:12
diabloevagto:盡信書不如無書 04/17 22:15
purpose:你沒有 side effect 的觀念吧,在 ptr++ 這個運算裡,主要 04/17 22:15
purpose:任務是算出 ptr 的值,之後的遞增純粹是副作用,而第2個 04/17 22:16
purpose:運算子 * 跟 ++ 之間沒有順序點,因此不保證何時需要遞增 04/17 22:17
leiyan:書本會有要先定義*ptr=ar只是解釋得不好懂 04/17 22:28
diabloevagto:結論就是加括號,別拿這個搞自己 04/17 22:31
william6718:先謝謝各位高手 那所以後面二維陣列指針的"詭異寫法" 04/17 22:40
william6718:就跳過別去理會嗎? 04/17 22:40
purpose:哪個後面的詭異寫法,你根本沒貼大家怎麼判斷要不要理 04/17 23:11
leiyan:*先跟&一起學吧 陣列還早 04/17 23:13
※ 編輯: william6718 來自: 59.112.117.8 (04/17 23:23)
mythnc:改變ptr,結果print p,應該連compile都不會過。 04/17 23:51
purpose:陣列解讀,可以看我寫的文章 #1ERylPtG (C_and_CPP) 04/18 00:13
kdjf:c++不清楚,不過C裡*,++是同級的,right to left 04/18 00:54