C++中按指针传递int时,*x++与*x+=1为何表现不同?
问题分析:为何
*x++无法递增变量,而*x+=1可以? 先看对应的代码片段:
int x = 0; incrementX(&x); // 此时x的结果不符合预期
void incrementX(int* x) { // x的值保持为0 *x++; // 值每次递增1、2、3…… *x+=1; }
核心原因是C++运算符的优先级与结合性差异:
对于
*x++:
后缀++的优先级高于间接访问运算符*,因此这个表达式等价于*(x++)。执行逻辑为:- 先对指针
x执行后缀自增:返回指针当前的原始地址(即传入的变量x的地址),随后指针x本身向后移动一个int的内存位置。 - 对返回的原始地址解引用,但这一步仅读取原变量的值,并未修改它——自增操作是作用在指针上,而非指针指向的变量,所以原变量
x的值保持0不变。
- 先对指针
对于
*x += 1:
复合赋值运算符+=的优先级低于*,执行逻辑为:- 先解引用指针
x,得到它指向的变量。 - 对该变量执行
+=1操作,直接修改变量的值,因此能实现预期的递增效果。
- 先解引用指针
如果想用指针实现指向变量的自增,需要用括号改变优先级,写成(*x)++——先解引用得到变量,再对变量执行自增,即可正确修改原变量的值。
内容的提问来源于stack exchange,提问作者developer68
相关产品推荐
相关产品推荐

