4 回答

TA貢獻1017條經(jīng)驗 獲得超1032個贊
*p++有運算符運算順序的問題,首先*和++運算符同級,但是結(jié)合性是從右往左,先執(zhí)行p++后執(zhí)行*
所以*p++=1即:
指針p指向的地址先自增1(此時指針p還是指向原地址空間),然后它指向的地址空間賦值為1,完成這一操作后指針指向下一個地址。

TA貢獻883條經(jīng)驗 獲得超454個贊
你采納的那個答案有些問題。
其實 后置自增運算符 p++ 的優(yōu)先級是高于 解引用運算符 * 的。在他給的那個圖里,后置自增運算符應該分類第一優(yōu)先級中。
這樣的話,似乎解釋上沒有太大差別,不過其實自增運算解釋起來還是有些復雜的:
1. 也是 ++ 先運算:得到的相當于是 p 指針。
2. 然后再算解引用運算符:得到上一步獲得的指針所指的對象(也就是 p 開始時所指的對象)。
3. 最后算賦值運算符:將 1 賦值給上一步得到的那個 p 所指的對象。
并且因為自增運算符還會使 p 自增,所以 p 在語句結(jié)束后肯定自增了,也就是會指向后面的一個對象。
注意上一句我說的是“p 在語句結(jié)束后肯定自增了”,我并沒有說“p在語句結(jié)束后才自增”之類的話,也就是說 p 具體是在哪個時點自增的是無法確定的。對這個語句而言,能確定的僅僅是 p 在語句結(jié)束后肯定已經(jīng)自增過了。
也許你會說,既然不確定 p 是何時自增的,也許 p 在第 2 步之前就自增了,那么第 2 步解引用的也可能是自增后的 p 了嗎?
確實 p 自增時機不確定,也可能會在第 2 步前自增。但這和第 2 步解引用運算沒有關(guān)系——因為解引用的根本就不是 p 指針!
我在第 1 步的描述中說的是“相當于是 p 指針”,沒有說“得到的是 p 指針”。因為 p++ 運算符得到的其實是當時 p 的值,并不是得到 p 指針本身。 或者說你可以認為 p++ 得到的是一個臨時指針,只不過該指針和 p 相等而已。所以后續(xù) p 是否自增什么的跟后面的運算沒有關(guān)系。
C 語言中有的運算符得到的是“對象的值”,有的運算符得到的是“對象本身”,請好好揣摩下這兩種說法的區(qū)別。比如第 2 步的解引用運算符,它得到的就是指針所指的對象本身,所以那一步中該對象會被賦值為 1。
所以你采納的那個答案中“此時指針p還是指向原地址空間”這句話其實也說錯了! 事實上并不能確定那時 p 是否已經(jīng)自增過了。
你這個代碼還有一個大問題:
*p++=*(p-1)+*(p-2); ?這語句的行為是未定義的!
道理和上面說的一樣,因為等號左邊有 p++ 表達式,這會使 p 自增,可是自增時機是不確定的,p 可能會在這語句執(zhí)行中的任何一個步驟時自增,所以等號右側(cè)那些 p-1 ?p+2 在計算時 p 的值是多少也是不確定的。那么整個表達式的結(jié)果就是未定義的!
- 4 回答
- 0 關(guān)注
- 3722 瀏覽
添加回答
舉報