C++指针传参时*n++无法自增而*n+=1正常运行的原因是什么
C++ 中
*n++不生效、*n += 1生效的核心原因 核心问题是C++运算符优先级规则导致两种写法的实际执行逻辑完全不同:
- 后置自增运算符
++的优先级高于解引用运算符*,而复合赋值运算符+=的优先级低于解引用运算符*。
两种写法的实际执行逻辑
1. *n++的实际执行逻辑
编译器会按照优先级将其解析为*(n++),执行顺序为:
- 记录指针
n当前存储的原始地址 - 指针
n本身自增,指向后一个同类型的内存地址 - 对第一步记录的原始地址做解引用,得到指向变量的值,但整个表达式没有对该值做修改操作
因此你想修改的指向变量完全不会变化,反而指针n本身被偏移了,这就是你观察到自增未生效的原因。
如果要通过后置自增修改指针指向的变量,正确写法是加括号强制优先级:(*n)++,先解引用拿到指向的变量,再对变量做自增。
2. *n += 1的实际执行逻辑
编译器优先计算优先级更高的解引用操作*n,直接拿到指针指向的变量,再对该变量执行加1的赋值操作,完全符合你预期的修改逻辑,所以可以正常生效。
代码示例验证
int val = 5; int* n = &val; *n++; // 执行后val仍为5,n不再指向val *n += 1; // 如果此时n已经偏移,这行甚至会触发未定义行为 // 正确修改val的写法 int* p = &val; (*p)++; // val变为6 *p += 1; // val变为7
内容的提问来源于stack exchange,提问作者Eklovya Sharma
相关产品推荐
相关产品推荐

