函数未更新变量值:复数乘法C程序输出异常求助
问题分析与解决方案
嘿,我一眼就揪出你代码里的问题啦!你每次输出全是0 + 0i,主要是两个原因:参数传递方式理解错了,再加上一个小笔误,咱们一步步说清楚:
核心问题:值传递导致修改无效
C语言里函数参数默认是值传递——你传给multiply的a_re、a_im(包括数组元素as_re[i]、as_im[i])都是原变量的「拷贝」。函数里修改的只是这个临时拷贝,根本碰不到全局变量或者数组里的原数据!
比如你在multiply里写a_re = c_re * b_re - c_im * b_im;,改的只是函数内部的局部变量,全局的a_re和数组as_re[i]完全没变化,所以最后赋值as_re[i] = a_re的时候,还是把初始的0传进去了。
次要问题:笔误导致虚部未初始化
你在main循环里写了两次:
cs_re[i] = i; cs_re[i] = i;
cs_im[i]根本没赋值!它的初始值是随机垃圾值,不过这不是当前输出全0的主因,但也是必须修正的bug。
修正后的代码方案
我给你改了两个关键地方,同时去掉了不必要的全局变量,代码更清晰:
#include <stdio.h> #include <stdlib.h> // 把a_re和a_im改成指针参数,让函数能直接修改外部变量 void multiply(int c_re, int c_im, int *a_re, int *a_im, int b_re, int b_im); int as_re[10]; int as_im[10]; int bs_re[10]; int bs_im[10]; int cs_re[10]; int cs_im[10]; int main(){ for (int i = 0; i < 10; i++){ bs_re[i] = i; bs_im[i] = i; cs_re[i] = i; // 修正笔误:给cs_im[i]赋值 cs_im[i] = i; // 传递数组元素的地址给multiply multiply(cs_re[i], cs_im[i], &as_re[i], &as_im[i], bs_re[i], bs_im[i]); // 现在不需要再赋值,multiply已经直接修改了数组里的值 printf("The product is %d + %di\n", as_re[i], as_im[i]); } return 0; } void multiply(int c_re, int c_im, int *a_re, int *a_im, int b_re, int b_im){ // 通过指针操作外部变量,把计算结果存进去 *a_re = c_re * b_re - c_im * b_im; *a_im = c_re * b_im + c_im * b_re; }
改动说明:
- 指针传递参数:把
multiply的a_re、a_im改成指针类型int *,调用时传&as_re[i](数组元素的地址),这样函数里的*a_re就是直接操作原数组元素,计算结果能正确存进去。 - 去掉冗余全局变量:原来的全局
a_re、a_im完全没必要,直接操作数组元素更直观。 - 修正笔误:给
cs_im[i]赋值,确保计算用的是正确的虚部值。
进阶优化:用结构体封装复数
如果想让代码更易读、更符合复数的逻辑,可以用结构体来封装实部和虚部,这样代码更整洁:
#include <stdio.h> // 定义复数结构体 typedef struct { int re; int im; } Complex; // 复数乘法函数,直接返回结果结构体 Complex multiply(Complex b, Complex c) { Complex result; result.re = b.re * c.re - b.im * c.im; result.im = b.re * c.im + b.im * c.re; return result; } int main(){ Complex as[10], bs[10], cs[10]; for (int i = 0; i < 10; i++){ bs[i].re = i; bs[i].im = i; cs[i].re = i; cs[i].im = i; as[i] = multiply(bs[i], cs[i]); printf("The product is %d + %di\n", as[i].re, as[i].im); } return 0; }
这种方式把复数作为一个整体处理,逻辑更清晰,也减少了参数数量,后期维护更方便。
内容的提问来源于stack exchange,提问作者Parseval
相关产品推荐
相关产品推荐

