算术运算的C程序实现
看清运算符优先级、类型转换与边界情况的每一步
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
算术运算的C程序实现
看清运算符优先级、类型转换与边界情况的每一步
C语言算术表达式概念
上一页我们看到 a+b、x*3 这些运算在程序中跑起来——它们在 C 语言里都属于「算术表达式」。那么,符合什么规则的写法才算合法的算术表达式?
数学式只在纸上算;C 表达式会被编译求值,还可能改变变量(副作用)
算术运算的实现
上一页我们把表达式拆成「操作数 + 运算符」。但 + 号让两个数变成一个,并不简单——背后涉及运算符种类、类型提升、整数与浮点的不同路径,还有溢出这类边界行为。
人民币+美元不能直加,得先按汇率统一;类型提升就是 C 语言自动做的「换汇」
整数相除
你口袋里有 10 块钱,分给 3 个朋友——每人拿 3 块,剩的 1 块你装回去。C 语言的整数相除就是这样:只留整数,零头不补。
10 分 3 人各拿 3,零头不找零——结果就是 3,不是 3.33
输入格式造成的计算错误
上一页的整数相除会丢小数。但更隐蔽的 bug 来自输入环节:scanf 的格式说明符和实际输入不一致时,程序不会报错,却悄悄算错。
你喊"3号"服务员记 3;喊"3.14号"她只听到"3号"记 3,".14" 卡在下单系统里影响下一单
求余运算
上一页讲整数相除只拿到商,但除法其实有两件事:分掉的部分和剩下的部分。剩下的那一块,就是这一页要讲的求余运算。
7颗糖分给3人,每人2颗分完,还剩1颗——剩下的就是7%3的结果
自增自减运算
在 for 循环里我们写过 i++,它每次让 i 加 1。但 ++ 放在 i 前面和后面,行为其实不一样——尤其当它出现在更复杂的表达式里时。
++i 像先翻到新页再读;i++ 像先读完当前页再翻页
复合运算
自增自减处理的是 a±1 的情形。日常更频繁的是 a = a + 5 这种「读旧值、加一下、写回」三步——C 把它压成一个运算符 +=,这就是复合运算。
擦掉旧数写上新数,比另起一行写 a=a+b 更直接
本节要点
- ✓类型决定行为:整数除法直接截断小数,求余只接受整数
- ✓i++ 返回旧值、++i 返回新值,混用于同一表达式是隐患
- ✓scanf 格式串里的空白字符会改变输入解析边界
- ✓复合赋值是语法糖,不改变语义也不带来性能提升
- ✓混合类型运算会触发隐式转换,结果常常反直觉
课后思考
先自己琢磨,再看参考答案。三个问题分别检验核心理解、应用思路与边界认知。
参考答案C语言追求执行效率,整数除法用CPU原生指令直接截断,比浮点除法快得多;实际影响是新人常在平均分计算等场景里踩坑。
参考答案方法一:把操作数强转为double再除,简单但有浮点精度误差;方法二:分子分母同放大100倍后整除再回退,精确但代码繁琐,没有银弹。
参考答案不能保证。C标准把「同一变量在表达式中被多次修改且无序列点分隔」列为未定义行为,编译器可以给出任何结果,代码应避免这种写法。