*p++=i怎么理解?


#include<stdio.h>
void fibonacci(int *p,int n)
{
 *p++=1;
 *p++=1;
 while(n>2)
 {
  *p++=*(p-1)+*(p-2);
   n--;
 }
}
void main()
{
 int i,f[20];
 fibonacci(f,20);
 for(i=0;i<=19;i++)
  printf("%d\n",f[i]);
}

求大佬幫我解釋下這段代碼, 中間的*p++=1是什么意思????_慕課猿問  https://www.imooc.com/wenda/detail/351407?t=246589

5 回答

已采納
?
望遠

*p++有運算符運算順序的問題,首先*和++運算符同級,但是結合性是從右往左,先執行p++后執行*

所以*p++=1即:

指針p指向的地址先自增1(此時指針p還是指向原地址空間),然后它指向的地址空間賦值為1,完成這一操作后指針指向下一個地址。

 反對 回復2017-06-08
  • 安之4183388
    安之4183388
    同等級的運算符運算順序是從右到左么????
  • onemoo
    onemoo
    同級運算符的運算順序不一定是從右到左的,具體是什么順序應該參考運算符優先級和結合性表。
?
onemoo

你采納的那個答案有些問題。

 

其實 后置自增運算符 p++ 的優先級是高於 解引用運算符 * 的。在他給的那個圖里,后置自增運算符應該分類第一優先級中。

這樣的話,似乎解釋上沒有太大差別,不過其實自增運算解釋起來還是有些復雜的:

1. 也是 ++ 先運算:得到的相當於是 p 指針。

2. 然后再算解引用運算符:得到上一步獲得的指針所指的對象(也就是 p 開始時所指的對象)。

3. 最后算賦值運算符:將 1 賦值給上一步得到的那個 p 所指的對象。

並且因為自增運算符還會使 p 自增,所以 p 在語句結束后肯定自增了,也就是會指向后面的一個對象。

 

注意上一句我說的是“p 在語句結束后肯定自增了”,我並沒有說“p在語句結束后才自增”之類的話,也就是說 p 具體是在哪個時點自增的是無法確定的。對這個語句而言,能確定的僅僅是 p 在語句結束后肯定已經自增過了。

也許你會說,既然不確定 p 是何時自增的,也許 p 在第 2 步之前就自增了,那么第 2 步解引用的也可能是自增后的 p 了嗎?

確實 p 自增時機不確定,也可能會在第 2 步前自增。但這和第 2 步解引用運算沒有關系——因為解引用的根本就不是 p 指針!

 

我在第 1 步的描述中說的是“相當於是 p 指針”,沒有說“得到的是 p 指針”。因為 p++ 運算符得到的其實是當時 p 的值,並不是得到 p 指針本身。 或者說你可以認為 p++ 得到的是一個臨時指針,只不過該指針和 p 相等而已。所以后續 p 是否自增什么的跟后面的運算沒有關系。

 

C 語言中有的運算符得到的是“對象的值”,有的運算符得到的是“對象本身”,請好好揣摩下這兩種說法的區別。比如第 2 步的解引用運算符,它得到的就是指針所指的對象本身,所以那一步中該對象會被賦值為 1。

 

 

所以你采納的那個答案中“此時指針p還是指向原地址空間”這句話其實也說錯了! 事實上並不能確定那時 p 是否已經自增過了。

 

 

你這個代碼還有一個大問題:

*p++=*(p-1)+*(p-2);  這語句的行為是未定義的!

道理和上面說的一樣,因為等號左邊有 p++ 表達式,這會使 p 自增,可是自增時機是不確定的,p 可能會在這語句執行中的任何一個步驟時自增,所以等號右側那些 p-1  p+2 在計算時 p 的值是多少也是不確定的。那么整個表達式的結果就是未定義的!

 反對 回復2017-06-09
 
?
灬elliott

p是地址,*p是這個地址指向的整數,   意思就是把  *p+1之后的值賦值給*p

 反對 回復2017-06-08
 
?
望遠

//img.mukewang.com/593956120001789c06060592.jpg

看一下這個C語言運算符優先級表

 反對 回復2017-06-08
  • onemoo
    onemoo
    怪不得之前提到這個問題時你的理解就有錯誤呢。原來是你參考的這個表格錯了! 后置自增/減運算符應該是屬於第 1 優先級的。
?
慕粉1146083187

指針p指向的地址先加1,然后它指向的值賦值為1,完成這一操作后指針指向改變,指向下一個地址。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM