C语言中如何在后续计算中使用参数初始值而非更新后的值?
解决方法:保留原始输入值进行运算
你的问题出在第一个赋值语句直接修改了*a指向的内存值,把最初的4覆盖成了9,导致后续计算*b时无法再获取到原始的a值。下面是两种清晰的解决方案:
方案一:保存所有原始输入值(最直观易维护)
在函数开头用临时变量把a和b的原始值存起来,后续所有运算都基于这些临时变量:
void update(int *a, int *b) { // 保存原始输入的a和b值 int original_a = *a; int original_b = *b; *a = original_a + original_b; // 4+5=9,正确更新a *b = abs(original_a - original_b); // 用原始值计算|4-5|=1,正确更新b }
方案二:仅保存原始a值(更简洁)
因为在修改*a之后,*b还没有被更新,所以我们只需要保存原始的a值即可:
void update(int *a, int *b) { int original_a = *a; // 先把原始的4存起来 *a = original_a + *b; // 更新a为9 *b = abs(original_a - *b); // 这里*b还是原始的5,所以计算|4-5|=1 }
为什么原来的代码会出错?
你原来的代码中,*a = *a + *b;执行后,*a指向的内存内容已经从4变成了9。后续执行*b = abs(*a - *b);时,*a取到的是更新后的9,所以算出来的是|9-5|=4,这和你想要的结果不符。通过提前保存原始值,就能避免这个问题。
内容的提问来源于stack exchange,提问作者Evan Ross Davis
相关产品推荐
相关产品推荐

