C++指针更新值异常求助:修改*a后*b计算结果不符预期?
指针值更新顺序导致的计算错误分析
问题核心非常明确:你先修改了*a的值,后续计算*b时使用的是已经被覆盖的新*a,而非原始输入的a值,所以得到了错误的结果。
举个具体的例子,输入a=4、b=5时:
- 你修改后的代码执行流程:
- 先执行
*a = *a + *b,此时*a被更新为4+5=9,原始的4已经被覆盖。 - 再执行
*b = abs(*a - *b),代入的是新的*a=9和未修改的*b=5,计算得abs(9-5)=4,这就是你得到4的原因。
- 先执行
错误代码示例
void update(int *a, int *b) { *a = *a + *b; // *a被覆盖为9 *b = abs(*a - *b); // 使用新*a计算,得到4 }
正确的两种写法
方法1:保存原始值
先把两个指针指向的原始值存到临时变量里,再分别计算和与差值:
void update(int *a, int *b) { int orig_a = *a; int orig_b = *b; *a = orig_a + orig_b; *b = abs(orig_a - orig_b); }
方法2:先计算差值再更新和
差值只依赖原始的a和b,所以先算出差值保存,再更新*a的值:
void update(int *a, int *b) { int diff = abs(*a - *b); *a = *a + *b; *b = diff; }
本质是要确保计算差值时使用的是输入时的原始数值,不能在计算差值前修改其中任何一个变量的原始值。
内容的提问来源于stack exchange,提问作者Shogun BS
相关产品推荐
相关产品推荐

