(p++)和p++有什么区别?++*p和*p++又有什么区别?

想问问我划线的语句有什么区别,这个判断到底是什么原理,根据运算符的优先级吗?

img

img

就是运算符优先级问题
加了括号,那么括号的优先级最高
不加括号,那么按就近原则
++*p,这没什么好说的,*肯定是跟p结合,再对结果进行++
如果是*++p,那么是先将p++,再取*,这些都很好理解
难点其实是*p++,到底是将p++再取*还是先取*再++,这里默认是先取*,除非加括号
至于p++还是++p,+在前就先执行+,+在后就先执行取值后+

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7660595
  • 这篇博客你也可以参考下:*p++中*和++的优先级问题
  • 除此之外, 这篇博客: 【C语言】运算符*和++的优先级关系及两者结合使用分析中的 1、*p++ 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • *(p++)这种写法尽量不要这样写,容易引起歧义,编译器实际上还是按照*p++来处理。
    

    因为文章开头提过,运算符*和++都属于单目运算符,两者的优先级是一样的,结合性的方向是从右到左。
    然后有些人会认为这个表达式的运算顺序是:p先自身+1,然后进行解引用。其实这种想法是错误的。
    正确的运算顺序应该是首先解引用指针变量p,然后p在自身加1。
    之所以不按照从右向左的结合性,是因为++自身的特性引起的,我们在前面已经讲过。