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

如何为C++计算器添加先乘除后加减的运算优先级支持?

解决C++计算器的运算优先级问题

你的计算器当前按输入顺序执行运算,未遵循先乘除后加减的优先级规则。递归实现出错是因为没按照表达式的层级结构设计逻辑,这里用递归下降解析法可优雅解决优先级问题,核心是把表达式拆分为两个层级:

  • 加减表达式:由多个乘除表达式通过加减运算符连接
  • 乘除表达式:由多个数字通过乘除运算符连接

以下是修正后的完整代码:

#include <iostream>
#include <cstdlib> // 用于exit()
using namespace std;

// 保留基础运算函数
float add(float num1, float num2) {
    return num1 + num2;
}
float subtract(float num1, float num2) {
    return num1 - num2;
}
float multiply(float num1, float num2) {
    return num1 * num2;
}
float divide(float num1, float num2) {
    if (num2 == 0) {
        cerr << "Cannot divide by 0" << endl;
        exit(1); // 除以0直接终止程序,避免错误结果输出
    }
    return num1 / num2;
}

// 读取单个数字,作为最基础的解析单元
float parsePrimary() {
    float num;
    cin >> num;
    return num;
}

// 处理乘除运算(优先级高)
float parseTerm() {
    float result = parsePrimary();
    char op;
    // 循环处理连续的乘除操作
    while (cin >> op && (op == '*' || op == '/')) {
        float num = parsePrimary();
        switch(op) {
            case '*':
                result = multiply(result, num);
                break;
            case '/':
                result = divide(result, num);
                break;
        }
    }
    // 把非乘除运算符放回输入流,供上层加减逻辑处理
    if (op != '=') {
        cin.putback(op);
    }
    return result;
}

// 处理加减运算(优先级低),调用parseTerm处理乘除
float calculate() {
    float result = parseTerm();
    char op;
    while (cin >> op && op != '=') {
        float num = parseTerm();
        switch(op) {
            case '+':
                result = add(result, num);
                break;
            case '-':
                result = subtract(result, num);
                break;
        }
    }
    return result;
}

int main(){
    cout << "Enter operation (format: 1 + 2 * 3 - 4 =): ";
    float final_number = calculate();
    cout << "The result is: " << final_number << endl;
    return 0;
}

代码说明:

  • parsePrimary():负责读取输入中的单个数字,是表达式解析的最小单元。
  • parseTerm():优先处理乘除运算,读取一个数字后循环检查后续运算符,遇到乘除则继续计算,遇到加减或等号时将运算符放回输入流,交给上层逻辑处理。
  • calculate():处理加减运算,先通过parseTerm()获取乘除表达式的结果,再循环处理后续的加减操作,每次都调用parseTerm()确保先完成高优先级运算。

测试输入1 + 2 *3 -4 =时,会先计算2*3=6,再依次计算1+6=7、7-4=3,完全符合运算优先级规则。

内容的提问来源于stack exchange,提问作者Peter Petrut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:07:18