*p++、*(p++)、(*p)++、*++p、++*p的区别
最近在刷题的时候遇到前缀自增、后缀自增以及取值符号之间的组合问题,这里记录一下:
问题提出
之前我一直理解的是前缀++优先级高于后缀++,然后我在翻阅C++优先级顺序表时却发现后缀++的优先级其实是高于前缀++和*的,但是为什么我们通常都说后缀++是等当前表达式完成再自增呢?
解答
然后我看了Effective C++发现:
也就是说,对于前缀++而言,首先自增然后再返回一个值,但是对于后缀++而言,首先返回值,然后再对该值自增,下面看几个例子:
后缀运算符++优先级高于前缀运算符++和*
后缀++结合律从左至右(先返回值后自增)
前缀++和*优先级相同结合律从右至左
例如:
- *p++与*(p++)相同,后缀++优先级更高,但后缀++先返回值(指针p),指针p与*结合之后,指针p再++,因此对应的结果是,输出指针p在自增前对应的值,指针p自增。
- (*p)++ 括号优先级最高,因此先对指针p取值,然后后缀++先返回值*p,再对*p这个整体自增,因此对应结果是输出*p的值,之后*p的值自增1,指针p指向的位置不变。
- *++p 即*(++p),最左是*,但后面跟的是表达式 ++p 所以要先算++p
- ++*p 即++(*p),最左是++ 但后面跟的是表达式*p 所以要先算*p (感谢@weixin_42004700更正)