如何为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
相关产品推荐
相关产品推荐

