C++数学表达式循环计算程序终止条件不符合预期问题求助
问题排查与解决方案
核心错误原因
你代码的核心问题出在循环条件的逻辑写反了:
- 你预期的终止规则:仅当两个操作数都为0时退出程序,对应循环继续执行的条件是「两个操作数不同时为0」
- 你写的
while (num1 !=0 && num2 !=0)含义是「两个操作数都不为0才继续循环」,只要任意一个操作数为0就会直接退出,完全不符合预期逻辑。
另外还有两个可优化的风险点:
- 浮点数直接用
==/!=判断是否等于0存在精度误差风险,建议用绝对值小于极小阈值的方式判断 - 除法运算没有校验除数为0的场景,会输出非法的无穷大结果
修改后的完整代码
#include <iostream> #include <cmath> using namespace std; int main() { const double EPS = 1e-9; double num1, num2; char symbol; cin >> num1 >> symbol >> num2; // 循环继续条件:两个数不同时为0 while (!(fabs(num1) < EPS && fabs(num2) < EPS)) { switch (symbol) { case '+': cout << num1 << " " << symbol << " " << num2 << " = " << num1 + num2 << endl; break; case '-': cout << num1 << " " << symbol << " " << num2 << " = " << num1 - num2 << endl; break; case 'X': case 'x': case '*': cout << num1 << " " << symbol << " " << num2 << " = " << num1 * num2 << endl; break; case '/': if (fabs(num2) < EPS) { cout << "Error: divisor cannot be zero" << endl; } else { cout << num1 << " " << symbol << " " << num2 << " = " << num1 / num2 << endl; } break; default: cout << "Invalid symbol" << endl; } cin >> num1 >> symbol >> num2; } return 0; }
关键修改说明
- 替换了循环条件,符合「两数均为0才退出」的要求
- 新增浮点数精度阈值
EPS避免浮点数判断误差 - 新增除法除数为0的校验逻辑,避免非法运算
- 合并了乘法的三个case,简化冗余代码
内容的提问来源于stack exchange,提问作者0-0_cryinginside
相关产品推荐
相关产品推荐

