为什么C++中*a++不生效且有警告,*a=*a+1可正常运行?
问题原因解析
核心原因是C/C++的运算符优先级规则导致两个写法的实际执行逻辑完全不同:
- 运算符优先级规则:后缀自增运算符
++的优先级高于解引用运算符*,因此*a++会被编译器自动解析为*(a++),而非用户预期的(*a)++。 *(a++)的执行逻辑:- 后缀自增
a++会先返回指针a的原始地址,随后将指针a本身的地址向后偏移1个int类型的长度,也就是修改了指针本身的指向,完全没有触及指针指向的存储值 - 对返回的原始地址做解引用操作,但得到的数值没有被赋值、也没有参与任何运算,属于无意义的废弃操作
- 后缀自增
- 这直接导致两个异常表现:
- 「给指针指向的int值加1」的预期逻辑完全没有执行,运行结果不符合预期
- 编译器检测到解引用的结果未被使用,因此会抛出对应警告
- 而
*a = *a + 1的执行逻辑完全符合预期:先解引用a拿到指向的int值,加1后重新写回a指向的内存地址,因此可以正确修改原变量的数值。
如果想使用自增语法实现相同效果,只需要加括号调整优先级即可:(*a)++。
内容的提问来源于stack exchange,提问作者Ronit Akhariya
相关产品推荐
相关产品推荐

