C语言将变量声明为float,编译时为何提示参数为double类型?
问题原因
- C语言的
scanf函数要求传入的变量参数是内存地址(指针),用来把用户输入的数值写入到对应的变量内存空间中。你当前代码里直接传了a、b这类float变量本身,没有加取地址符&,所以编译器识别到类型不匹配,抛出警告。 - 另外代码还存在逻辑顺序问题:你先计算了
x和y,再判断分母a*e-b*d是否为0,分母为0的时候会触发除零错误,需要把计算逻辑放到分母非0的判断分支里。 scanf的格式字符串里额外加了末尾的\n,会导致输入完对应数值回车后,程序判定输入未结束,需要额外输入内容才能继续执行,不符合预期。
修正后可正常运行的代码
#include <stdio.h> // 如需优化浮点数相等判断可引入math.h头文件 // #include <math.h> int main() { float a, b, c, d, e, f, x, y; float det; // 存储行列式值,避免重复计算 printf("Insert the 4 coefficients\n"); // 每个变量前加取地址符&,去掉格式串里多余的\n scanf("%f%f%f%f", &a, &b, &d, &e); printf("Insert the 2 constants\n"); scanf("%f%f", &c, &f); det = a*e - b*d; // 浮点数判断优化写法:if (fabs(det) > 1e-6) if (det != 0) { // 分母非0时再计算x和y,避免除零错误 x = (c*e - b*f) / det; y = (a*f - c*d) / det; printf("The system is possible and determined. The results are x=%f and y=%f\n", x, y); } // 浮点数判断优化写法:else if (fabs(a*f - c*d) < 1e-6 && fabs(c*e - b*f) < 1e-6) else if (a*f - c*d == 0 && c*e - b*f == 0) { printf("The system is possible and undetermined\n"); } else { printf("The system is impossible"); } return 0; }
额外注意事项
浮点数的相等判断尽量不要直接用==,因为浮点数存在精度误差,可以设置一个极小的误差阈值比如1e-6,判断两个数的差值绝对值小于阈值就认为相等,参考代码注释里的优化写法即可。
内容的提问来源于stack exchange,提问作者saegis
相关产品推荐
相关产品推荐

