#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

    同等级的运算符运算顺序是从右到左么????
    回复举报2017-06-08
  • onemoo

    同级运算符的运算顺序不一定是从右到左的,具体是什么顺序应该参考运算符优先级和结合性表。
    回复举报2017-06-09

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
 

望远

看一下这个C语言运算符优先级表

 反对 回复2017-06-08
  • onemoo

    怪不得之前提到这个问题时你的理解就有错误呢。原来是你参考的这个表格错了! 后置自增/减运算符应该是属于第 1 优先级的。
    回复举报2017-06-09

慕粉1146083187

指针p指向的地址先加1,然后它指向的值赋值为1,完成这一操作后指针指向改变,指向下一个地址。

  

最新文章

  1. java.lang.Comparable&lt;T&gt; 接口
  2. XAMARIN +VS2015 ANDROID 开发判断gps 是否打开。
  3. redis持久化机制
  4. GridView EmptyDataTemplate 动态显示
  5. PHP Pthread多线程 操作
  6. Python 调用百度翻译API
  7. IOS 登陆界面的简单编写(通过NSNotificationCenter)
  8. BZOJ1230 [Usaco2008 Nov]lites 开关灯
  9. Asp.net从文件夹中读取图片,随机背景图
  10. MCS-51特殊功能寄存器(SPR)的C51定义
  11. jvm回收方法区
  12. IBM Minus One
  13. 【bzoj4011 hnoi2015】落忆枫音
  14. bzoj 3239 poj 2417 BSGS
  15. myeclipse附加源码进行查看的方法
  16. java线程的学习
  17. Python 连接MongoDB并比较两个字符串相似度的简单示例
  18. python中的目录递归的创建和目录及其下的文件递归的删除
  19. $Miller Rabin$总结
  20. 【Selenium2】【selenium之 定位以及切换frame(iframe)】

热门文章

  1. Mancala II
  2. 怎样写一个Hello World!
  3. R-corrplot相关性绘图,只有你想不到的
  4. 关于如何查看 MySQL 信息、查看Oracle 版本
  5. com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction 问题解决
  6. oracle的listagg函数
  7. Nginx如何配置禁止访问某个目录
  8. 使用PHP 格式化时间
  9. zabbix环境mysql分区表管理历史数据_python实现
  10. 第五章、Django之多表查询进阶与事务