C++中Switch语句失效及Makefile编译abc.o目标失败求助
解决你的二次求根公式代码问题
问题1:Switch语句无法正常工作的原因
Switch在C++里有个硬规则:case后面必须跟编译期常量表达式,你写的case < 0:、case > 0:这种比较式完全不符合语法,编译器根本没法识别。
对于判别式这种需要判断数值范围的场景,if-else才是正确选择——它能灵活处理区间判断,完全适配你这里的需求。
问题2:编译错误的根源
你看到的D:\c++ dev-c\Makefile.win recipe for target 'abc.o' failed错误,本质就是上面switch的语法错误导致的。编译器解析代码时,遇到非法的case写法直接卡壳,没法生成目标文件(abc.o),所以抛出了这个错误。修复switch的语法问题后,这个编译错误自然会消失。
修正后的完整代码
#include <iostream> #include <cmath> using namespace std; class abcformule{ public: // 把返回类型改成double,避免精度丢失 double discriminant(double a, double b, double c) { return pow(b, 2) - 4 * a * c; } void answer(double a2, double b2, double c2) { double D = discriminant(a2, b2, c2); // 用double存储判别式,保留精度 if (D < 0) { cout << "Discriminant is lower than 0, no real solutions for x." << endl; } else if (D > 0) { double x1 = (-b2 + sqrt(D)) / (2 * a2); double x2 = (-b2 - sqrt(D)) / (2 * a2); cout << "Two distinct real solutions:" << endl; cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << endl; } else { // 处理判别式为0的情况 double x = (-b2) / (2 * a2); cout << "One repeated real solution:" << endl; cout << "x = " << x << endl; } } }; // 新增main函数方便测试 int main() { abcformule solver; double a, b, c; cout << "Enter coefficients a, b, c: "; cin >> a >> b >> c; solver.answer(a, b, c); return 0; }
额外优化提示
- 判别式改用
double类型:原来的int返回会丢失浮点数精度,比如判别式是2.5时会被截断成2,导致判断错误。 - 补充了D=0的场景:覆盖了二次方程所有可能的根的情况。
- 新增测试用的main函数:可以直接输入系数验证代码运行结果。
内容的提问来源于stack exchange,提问作者Lucas Knook
相关产品推荐
相关产品推荐

