zoukankan      html  css  js  c++  java
  • *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
    ",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,完成这一操作后指针指向改变,指向下一个地址。

      

  • 相关阅读:
    java依赖注入
    Mac OS 中的 Python(和 NumPy)开发环境设置
    英语巴菲
    经济学原理
    You are beautiful
    大数据之tachyon(未完版)
    机器学习温和指南
    机器学习之回归
    Mac 命令
    批处理--批量打开程序&批量关闭程序
  • 原文地址:https://www.cnblogs.com/tongongV/p/10990590.html
Copyright © 2011-2022 走看看