0

0

C++计算器怎么写 C++实现四则运算的简单代码【案例】

冰火之心

冰火之心

发布时间:2026-01-27 11:23:03

|

537人浏览过

|

来源于php中文网

原创

应使用双栈法解析四则运算表达式,而非std::stringstream或std::stod;维护nums和ops栈,按优先级计算,处理括号与负号,并严格校验输入合法性。

c++计算器怎么写 c++实现四则运算的简单代码【案例】

std::stringstreamstd::stod 解析表达式太危险

直接用字符串流或类型转换函数处理用户输入的四则运算表达式(比如 "3 + 4 * 2"),几乎必然出错。这些工具不理解运算符优先级,也不会递归解析括号,std::stod("3 + 4 * 2") 只会读到 3 就停,后面全被忽略。真要这么做,得自己拆分 token、建、模拟运算过程——相当于重写一个简易解释器。

推荐用双栈法实现中缀表达式求值(支持 + - * / 和括号)

这是教科书级解法,稳定、易懂、能覆盖常见需求。核心是维护两个栈:nums 存操作数,ops 存运算符。遇到数字就入 nums;遇到运算符时,先检查栈顶是否该立即计算(比如当前是 *,而栈顶是 +,那 + 不能等,得先算掉);遇到左括号无条件入栈,右括号则一路弹出直到左括号。

  • 优先级判断用 map:比如 {'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}
  • 注意负号处理:若 - 出现在开头或左括号后(如 "(-5 + 3)"),应视为一元负号,需补 0 入 nums
  • 除零必须检查:if (b == 0) throw std::runtime_error("division by zero");
double calc(double a, double b, char op) {
    switch(op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': if (b == 0) throw std::runtime_error("division by zero"); return a / b;
    }
    return 0;
}

别硬啃字符串解析,先用空格分隔再处理更稳妥

如果只要求用户输入带空格的格式(如 "3 + 4 * 2""10 / ( 2 - 1 )"),可以先用 std::istringstream 按空格切分 token,再逐个识别数字、运算符、括号。这样避免手写跳过空白、识别多位数、处理小数点等边界问题。

  • 读 token 时用 while (iss >> token)tokenstd::string
  • 判断 token == "("token == ")" 比判断单个字符更清晰
  • 数字用 std::stod(token) 安全转换,前提是已确认 token 不含非法字符

输入验证和错误恢复容易被忽略

真实场景下,用户可能输 "3++4""(5 + ""abc * 2"。只靠双栈逻辑无法捕获所有异常,必须在解析前/中加校验:

阿里妈妈·创意中心
阿里妈妈·创意中心

阿里妈妈营销创意中心

下载

立即学习C++免费学习笔记(深入)”;

  • 扫描原始字符串,确保每个字符属于 0-9+-*/()、空格;小数点需成对出现在数字中
  • 左右括号数量必须相等,且过程中右括号不能多于左括号
  • 连续两个运算符(除一元负号外)非法,如 "3 * + 4"
  • 计算完成后,nums 应只剩 1 个数,ops 应为空,否则说明表达式不完整

这些检查点分散在词法分析和语法计算阶段,漏掉任意一个,程序就可能崩溃或返回错误结果。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

422

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1498

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

231

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

87

2025.10.17

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

775

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

94

2023.09.25

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6141

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

816

2023.09.14

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

6

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.2万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号