AI开发C语言应用按步走,表达式计算器calc的第二步,增加取模运算、区分负号和减号与自动测试
calc2 — 取模运算、负号区分与自动化测试1. 概述本次迭代在 calc1 基础上完成三项增强取模运算— 新增%运算符支持TOKEN_MOD负号与减号区分— 通过expect_operand状态机将一元负号如-5与二元减号如3-5解析为不同的 token 类型自动化测试— 创建test.expr测试用例文件在 Makefile 中添加test目标支持一键运行全部测试2. 变更清单文件操作说明parse.h编辑TokenType 枚举增加TOKEN_MOD和TOKEN_NEG更新注释parse.c编辑增加expect_operand状态和update_expect辅助函数parse_next中区分负号/减号并处理%token_name增加两个 caseMakefile编辑新增TESTFILE变量和test目标test.expr新建9 个测试用例main.c无需改动。3. 取模运算3.1 parse.htypedefenum{TOKEN_NUMBER,/* 整数字面量 */TOKEN_PLUS,/* */TOKEN_MINUS,/* -二元减号 */TOKEN_STAR,/* * */TOKEN_SLASH,/* / */TOKEN_MOD,/* % ← 新增 */TOKEN_LPAREN,/* ( */TOKEN_RPAREN,/* ) */TOKEN_NEG,/* -一元负号 ← 新增 */TOKEN_END,/* 输入结束 */TOKEN_ERROR/* 非法字符 */}TokenType;3.2 parse.c在运算符 switch 中新增%分支case%:tok.typeTOKEN_MOD;break;token_name中对应caseTOKEN_MOD:returnMOD;4. 负号与减号区分核心设计引入expect_operand状态变量记录下一位置是否期待操作数从而决定-的语义。4.1 expect_operand 判定规则上下文-的语义对应 Token原因表达式开头负号TOKEN_NEG如-53运算符之后 ( - * / %)负号TOKEN_NEG如3-5左括号之后(负号TOKEN_NEG如(-3)数字或右括号之后减号TOKEN_MINUS如3-5,(a)-b4.2 状态更新规则每解析一个 token 后根据其类型更新expect_operandToken 类型expect_operand 设为原因NUMBER,RPAREN0操作数之后应跟运算符PLUS,MINUS,STAR,SLASH,MOD,LPAREN,NEG1运算符/左括号/负号之后应跟操作数END,ERROR不变结束或错误无需继续4.3 parse_next 中的判定逻辑/* 跳过空白后先处理 - 的特殊情况 */if(*input_pos-expect_operand){tok.typeTOKEN_NEG;input_pos;column;update_expect(tok.type);returntok;}/* 然后进入 switch 处理其他运算符 */switch(*input_pos){case-:tok.typeTOKEN_MINUS;break;/* expect_operand0 时才会走到这里 */case%:tok.typeTOKEN_MOD;break;/* ... */}5. 自动化测试5.1 test.expr 文件格式每行一个测试用例表达式 | 期望退出码空行和#开头的行被忽略。# 测试用例 # 格式: 表达式 | 期望退出码 (90-18)/315 | 0 10%3 | 0 -53 | 0 3-5 | 0 (-3) | 0 (-820)%-3 | 0 3 5 | 0 35 | 1 empty | 1共9 个测试用例#表达式期望退出码覆盖场景1(90-18)/3150基本表达式回归210%30取模运算3-530负号开头43-50运算符后负号5(-3)0括号后负号6(-820)%-30混合 取模 负号73 50多余空格8351非法字符9empty1空输入5.2 Makefile test 目标TESTFILE test.expr test: $(TARGET) total0; pass0; fail0; \ while IFS| read -r expr expected; do \ expr$$(echo $$expr | sed s/^[[:space:]]*//; s/[[:space:]]*$$//); \ expected$$(echo $$expected | sed s/^[[:space:]]*//; s/[[:space:]]*$$//); \ case $$expr in |\#*) continue;; esac; \ total$$((total 1)); \ if [ $$expr empty ]; then \ $(TARGET) /dev/null 21; actual$$?; \ else \ $(TARGET) $$expr /dev/null 21; actual$$?; \ fi; \ if [ $$actual $$expected ]; then \ printf PASS [%2d] %s\n $$total $$expr; \ else \ printf FAIL [%2d] %s (expected %s, got %s)\n \ $$total $$expr $$expected $$actual; \ fi; \ done $(TESTFILE); \ echo $$pass passed, $$fail failed, $$total total; \ [ $$fail -eq 0 ]设计要点依赖$(TARGET)自动先编译再测试 /dev/null 21丢弃程序输出仅校验退出码变量$$expr和$$expected前后去空格6. 目录结构更新后calc/ ├── Makefile # 构建脚本新增 test 目标 ├── parse.h # 头文件新增 TOKEN_MOD, TOKEN_NEG ├── parse.c # 词法分析器实现新增负号/减号区分逻辑 ├── main.c # 入口程序未改动 ├── test.expr # 测试用例文件新增 ├── doc/ │ ├── calc1.md # 第一次构建笔记 │ └── calc2.md # 本次构建笔记 └── build/ ├── calc ├── parse.o └── main.o7. 测试验证$maketestcalc — 测试套件PASS[1](90-18)/315 PASS[2]10%3 PASS[3]-53 PASS[4]3-5 PASS[5](-3)PASS[6](-820)%-3 PASS[7]35PASS[8]35 PASS[9]empty9passed,0failed,9total8. 新增 Token 一览枚举值对应字符token_name 输出含义TOKEN_MOD%MOD取模运算符二元TOKEN_NEG-NEGATIVE负号运算符一元新 Token 输出示例输入关键输出行10%3% MOD-5- NEGATIVE3-5- MINUS二元减号保持原输出3-5 PLUS/- NEGATIVE

相关新闻

Android Studio输入法开发全指南:从原理到实践

Android Studio输入法开发全指南:从原理到实践

1. Android Studio输入法开发基础解析 作为Android开发者,我们经常需要处理各种输入场景。Android输入法框架(IME)是连接用户与应用的重要桥梁,它允许开发者创建自定义输入解决方案。在Android Studio环境下开发输入法,需要掌握以下几个核心要…

2026/7/19 9:12:05阅读更多 →
2026南昌黄金回收白银回收铂金回收靠谱临街实体公安备案支持到店核验门店联系方式推荐

2026南昌黄金回收白银回收铂金回收靠谱临街实体公安备案支持到店核验门店联系方式推荐

南昌黄金白银铂金回收2026实测榜单|公安备案临街实体门店支持到店核验 南昌黄金回收哪家靠谱|工商公安双备案中检认证实体门店 南昌贵金属回收店铺遍地丛生,行业套路层出不穷,不少市民变现遭遇虚高报价、克扣损耗、未经同意熔金压…

2026/7/19 9:12:05阅读更多 →
Claude Code Agent四种运行模式:从Prompt到Loop的工程实践

Claude Code Agent四种运行模式:从Prompt到Loop的工程实践

如果你还在用传统的 Prompt Engineering 思路来使用 Claude Code,那么你可能只发挥了它 20% 的能力。真正的价值不在于单次问答的精准度,而在于 Claude Code Agent 能够自主执行多轮复杂任务的能力——这就是 Loop Engineering 的核心。 想象一下这样的…

2026/7/19 9:12:05阅读更多 →
XHS-Downloader技术解析:小红书内容采集与自动化下载方案

XHS-Downloader技术解析:小红书内容采集与自动化下载方案

XHS-Downloader技术解析:小红书内容采集与自动化下载方案 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接&…

2026/7/19 14:33:02阅读更多 →
086、3D-LUT色彩映射:高精度色彩还原与风格化色调映射的工程实现

086、3D-LUT色彩映射:高精度色彩还原与风格化色调映射的工程实现

086、3D-LUT色彩映射:高精度色彩还原与风格化色调映射的工程实现 从一次“肤色发绿”的调试说起 去年做一款旗舰机前置摄像头,客户反馈在暖色灯光下自拍,人脸肤色偏绿,像得了黄疸。我们ISP团队折腾了两周,调了CCM矩阵、改过Gamma曲线、甚至怀疑sensor的R/G/B通道串扰,效…

2026/7/19 14:33:02阅读更多 →
087、Gamma校正与色调映射:从CRT曲线到HDR场景的亮度映射优化

087、Gamma校正与色调映射:从CRT曲线到HDR场景的亮度映射优化

087、Gamma校正与色调映射:从CRT曲线到HDR场景的亮度映射优化 去年在调试一款旗舰手机的后置主摄时,遇到一个让人抓狂的问题:预览画面在低亮度场景下,暗部细节像是被一层灰雾盖住,提亮后噪点又炸裂。客户反馈说“画面不通透”,但ISP的AE和AWB都正常,RAW域数据也没问题。…

2026/7/19 14:33:02阅读更多 →
MooaToon终极指南:5步掌握UE5三渲二核心技术,打造惊艳卡通世界

MooaToon终极指南:5步掌握UE5三渲二核心技术,打造惊艳卡通世界

MooaToon终极指南:5步掌握UE5三渲二核心技术,打造惊艳卡通世界 【免费下载链接】MooaToon The Ultimate Solution for Cinematic Toon Rendering in UE5 项目地址: https://gitcode.com/gh_mirrors/mo/MooaToon 你是否也曾为UE5的写实渲染效果无法…

2026/7/19 14:33:02阅读更多 →
088、宽动态HDR技术对比:多帧融合HDR、DOL-HDR与staggered HDR的架构与调优

088、宽动态HDR技术对比:多帧融合HDR、DOL-HDR与staggered HDR的架构与调优

088、宽动态HDR技术对比:多帧融合HDR、DOL-HDR与staggered HDR的架构与调优 去年夏天,一个车载项目让我在实验室熬了三个通宵。客户要求前视摄像头在隧道出口场景下,同时看清洞内暗处行人和洞外高亮天空。我调了整整两版多帧融合HDR,结果运动物体拖影严重,客户直接甩了一句…

2026/7/19 14:33:02阅读更多 →
Powerlevel10k终极配置指南:打造极速美观的Zsh终端主题

Powerlevel10k终极配置指南:打造极速美观的Zsh终端主题

Powerlevel10k终极配置指南:打造极速美观的Zsh终端主题 【免费下载链接】powerlevel10k A Zsh theme 项目地址: https://gitcode.com/GitHub_Trending/po/powerlevel10k 你是否厌倦了单调的终端界面?是否在寻找一个既美观又高效的Zsh主题解决方案…

2026/7/19 14:31:02阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →