*p++、*(p++)、(*p)++、*++p、++*p的区别

*p++、*(p++)、(*p)++、*++p、++*p的区别

最近在刷题的时候遇到前缀自增、后缀自增以及取值符号之间的组合问题,这里记录一下:

问题提出

之前我一直理解的是前缀++优先级高于后缀++,然后我在翻阅C++优先级顺序表时却发现后缀++的优先级其实是高于前缀++和*的,但是为什么我们通常都说后缀++是等当前表达式完成再自增呢?

解答

然后我看了Effective C++发现:
前缀++与后缀++
也就是说,对于前缀++而言,首先自增然后再返回一个值,但是对于后缀++而言,首先返回值,然后再对该值自增,下面看几个例子:
后缀运算符++优先级高于前缀运算符++和*
后缀++结合律从左至右(先返回值后自增)
前缀++和*优先级相同结合律从右至左
例如:

  1. *p++与*(p++)相同,后缀++优先级更高,但后缀++先返回值(指针p),指针p与*结合之后,指针p再++,因此对应的结果是,输出指针p在自增前对应的值,指针p自增。
  2. (*p)++ 括号优先级最高,因此先对指针p取值,然后后缀++先返回值*p,再对*p这个整体自增,因此对应结果是输出*p的值,之后*p的值自增1,指针p指向的位置不变。
  3. *++p 即*(++p),最右是*,但后面跟的是表达式 ++p 所以要先算++p
  4. ++*p 即++(*p),最右是++ 但后面跟的是表达式*p 所以要先算*p

猜你喜欢

转载自blog.csdn.net/ljytower/article/details/85045739