问答题 *p++与(*p)++等价吗?为什么
【正确答案】
【答案解析】在回答这个问题前,必须弄明白一个问题,就是C语言中操作符的优先级问题。在C语言中,优先级由高到低的排序主要遵循如下规则:
1)函数符号(),数组下标[],数组下标符号.,成员符号->,结合性从左往右。
2)单目运算符:!,~,++,--,-(type)*,&,sizeof结合性从右往左。
3)算术运算法:*、/、%,结合性从左往右。
4)+、-结合性从左往右。
5)移位运算符:<<,>>,>>>结合性从左往右。
6)关系运算符:<,<=,>,>=结合性从左往右。
7)==,!=_结合性从左往右。
8)逻辑运算符:首先,按位运算符&、^与|,且&高于^,^高于|,结合性从左往右;其次,逻辑运算符&&与‖,且&&高于‖,结合性从左往右。
9)三目运算符?:,结合性从右往左;其次是赋值运算符=,结合性从右往左;最后是逗号运算符,结合性从左往右。
对于操作符的优先级总结如下:
1)关系运算符优于逻辑运算符。
2)移位运算符介于算术运算符和比较运算符之间。
3)除单目运算符外,算术运算符的优先级最高。
所以,因为优先级顺序的问题,*p++与(*p)++并不等价,前者先完成取值操作,然后对指针地址执行++操作;而后者为首先执行取值操作,然后对该值进行++运算。