0

0

c++中如何实现简单的计算器程序_c++四则运算逻辑实现

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-09 15:22:02

|

942人浏览过

|

来源于php中文网

原创

应使用 std::getline 读整行再用 std::stringstream 解析,避免 cin >> 跳过运算符或因无空格导致读取错误;仅支持单二元运算,多运算需两遍扫描处理优先级;须用 try-catch 处理 stod 异常,检查除零时用 abs(b)

c++中如何实现简单的计算器程序_c++四则运算逻辑实现

std::stringstreamstd::getline 解析单行表达式

用户输入形如 "3 + 5 * 2" 的字符串时,不能直接用 cin >> 拆分——它会把 "+" 当作分隔符跳过,且无法处理空格不规范的输入(比如 "3+5 *2")。稳妥做法是读整行,再用 std::stringstream 逐词提取:

std::string line;
std::getline(std::cin, line);
std::stringstream ss(line);
double a; char op; double b;
if (ss >> a >> op >> b) {
    // 成功读到两个数和一个运算符
}

注意:这仅适用于**单个二元运算**(如 "10 - 3"),不支持多运算符或括号。若用户输 "1 + 2 + 3"ss >> a >> op >> b 只取前三个 token(即 1'+'2),末尾的 "+ 3" 被忽略。

手写简易运算符优先级处理(无括号)

要支持 "3 + 5 * 2" 正确算出 13 而非 16,必须先识别乘除,再做加减。可采用“两遍扫描”策略:

  • 第一遍:把输入按空格切分(或用 std::stringstream 提取所有 token),存入 std::vector<:string>
  • 第二遍:遍历 token,遇到 "*""/" 就立即计算其左右数字,并用结果替换这三个元素(如 {"3", "+", "5", "*", "2"} → 合并 "5", "*", "2""10",得到 {"3", "+", "10"}
  • 第三遍:对剩余 "+""-" 从左到右计算

关键点:std::stod() 转数字时抛异常(如输入 "abc"),务必用 try-catch 包裹;"-" 既作减号也作负号,简单计算器通常只支持二元减法,不处理 "-5 + 3" 这类前缀负号。

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

避免 std::cin >> 导致输入阻塞的典型错误

常见错误写法:

Speech Studio
Speech Studio

微软语音服务,提供语音到文本、文本到语音和语音翻译功能。

下载
double a, b;
char op;
std::cin >> a >> op >> b;  // 若用户输 "3+5"(无空格),op 会读成 '3',b 读失败,流进入 failbit

后果:std::cin 状态卡住,后续所有输入都被跳过。修复方式只有两种:

  • 改用 std::getline + std::stringstream(推荐,见第一个副标题)
  • 若坚持用 >>,每次读后检查状态:if (!std::cin) { std::cin.clear(); std::cin.ignore(1000, '\n'); }

另外,std::cin >>"3.14e2" 这类科学计数法能正确解析,但对 "3,14"(逗号小数点)直接失败——C++ 默认 locale 是英文格式,不支持千位分隔符或本地化小数点。

除零和浮点精度问题怎么处理

除法必须显式检查:if (b == 0.0) 不可靠,因为浮点数比较需容忍误差。应写成:

const double EPS = 1e-9;
if (std::abs(b) < EPS) {
    std::cout << "Error: division by zero\n";
    return;
}

但注意:这只能捕获真正接近零的除数,无法区分 0.0-0.0(它们在 IEEE 754 中不同,但 std::abs(-0.0) 仍是 0.0)。实际中,简单计算器可直接用 b == 0.0 判断,因为用户不会手动输 -0.0。更隐蔽的问题是 std::pow(0, 0) 或开方负数——四则运算不涉及这些,但若后续扩展函数功能,必须单独拦截。

浮点误差本身无法消除,例如 0.1 + 0.2 输出 0.30000000000000004。显示时可用 std::setprecision(10) 控制小数位,但底层值不变。

相关专题

更多
java基础知识汇总
java基础知识汇总

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

1463

2023.10.24

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

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

228

2024.02.23

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

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

85

2025.10.17

if什么意思
if什么意思

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

723

2023.08.22

登录token无效
登录token无效

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

6072

2023.09.14

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

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

794

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1054

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1192

2024.03.01

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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