You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++数学表达式循环计算程序终止条件不符合预期问题求助

问题排查与解决方案

核心错误原因

你代码的核心问题出在循环条件的逻辑写反了:

  • 你预期的终止规则:仅当两个操作数都为0时退出程序,对应循环继续执行的条件是「两个操作数不同时为0」
  • 你写的while (num1 !=0 && num2 !=0)含义是「两个操作数都不为0才继续循环」,只要任意一个操作数为0就会直接退出,完全不符合预期逻辑。

另外还有两个可优化的风险点:

  1. 浮点数直接用==/!=判断是否等于0存在精度误差风险,建议用绝对值小于极小阈值的方式判断
  2. 除法运算没有校验除数为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:48:02