在c语言中*
和++
是同优先级的,需要按从右到左的顺序执行。
下面进行一些测试
#include <iostream>
using namespace std;
int main() {
int pval[5] = {11, 22, 33, 44, 55};
int* p;
cout << "*pval = " << *pval << ", pval = " << pval << endl;
p = pval;
cout << "*p = " << *p << ", p = " << p << endl;
// 右自增: *p++ *(p++) (*p)++
p = pval;
cout << "*p++ = " << *p++ << ", *p = " << *p << ", p = " << p << endl;
p = pval;
cout << "*(p++) = " << *(p++) << ", *p = " << *p << ", p = " << p << endl;
p = pval;
cout << "(*p)++ = " << (*p)++ << ", *p = " << *p << ", p = " << p << endl;
// 左自增:++*p 和 ++(*p)
pval[0] = 11;
p = pval;
cout << "++*p = " << ++*p << ", *p = " << *p << ", p = " << p << endl;
pval[0] = 11;
p = pval;
cout << "++(*p) = " << ++(*p) << ", *p = " << *p << ", p = " << p << endl;
return 0;
}
运算结果如下:
/*
*pval = 11, pval = 0x61fe00
*p = 11, p = 0x61fe00
*p++ = 11, *p = 22, p = 0x61fe04
*(p++) = 11, *p = 22, p = 0x61fe04
(*p)++ = 11, *p = 12, p = 0x61fe00
++*p = 12, *p = 12, p = 0x61fe00
++(*p) = 12, *p = 12, p = 0x61fe00
分析:
* 和 ++的运算优先级是相同的,故是从左到右计算的
*p++ : 等同于:*(p++); *p; p = p + 1; 从结果来看,是先p++,再用p++的返回值(即p)进行解引用,等同于*(p++)
*(p++) : 等同于:*p; p = p + 1; 先p++,在解引用,由于p++返回的还是p的地址,故解引用还是取第一个地址的元素,但运算完之后此时p已经+1了
(*p)++ : 等同于:*p = *p + 1; 先取*p,在对*p做++, 等同于(*p)++, 即等于p[0]++;
++*p : 等同于++(*p)
++(*p) : 等同于:++(p[0]); 先取*p,然后对其取出的结果进行前置的++,
总结:
*p++ 和 *(p++) 等价,两个表达式的值都等价于*p的值,执行表达式之后,指针p的值增加一个地址单元长度,指向数组下一个位置;
(*p)++ 的值等价于*p的值,执行表达之后,指针p的值不变,p所指向的地址单元的值+1;
++*p 和 ++(*p) 等价,两个表达式的值都等于 *p 的值 +1(左++先自增后参与运算),指针p的值不变,p所指向的地址单元的值+1.
*/
总结:
-
*p++
:*和++都是同级运算符,右结合。但++要整个表达式运算完了才运算,先提取p指向对象的值,然后p再做++运算,指向下一个对象。 -
*(p++)
: ++要整个表达式运算完了才自加,所以同上,提取的还是P指向的对象值,提取后,P就指向下一个对象了。 -
(*p)++
: 先取值,然后值右++; -
++*p
: 是先取值,然后值++; -
++(*p)
: 等同于++*p
,先取值,然后值左++;