模块一 · 入门基础 / 第 04 课
04 · 运算符:算术、比较、逻辑
学习目标
- 会做加减乘除和取余
- 会写比较表达式(结果是真/假)
- 会用 && || ! 组合条件
算术运算符
| 运算符 | 含义 | 例子 | 结果 |
|---|---|---|---|
+ - * | 加减乘 | 3+4*2 | 11(先乘除) |
/ | 除 | 7/2 | 3(整数除丢掉小数) |
% | 取余 | 7%2 | 1 |
++ -- | 加一减一 | n++ | n 变成 n+1 |
新手最容易踩的坑
7 / 2 在两边都是整数时结果是 3,不是 3.5。
要小数就写成 7.0 / 2 或强制转成 float。#include <stdio.h>
int main(void)
{
int a = 7, b = 2;
printf("%d\n", a / b); // 3
printf("%d\n", a % b); // 1
printf("%f\n", 7.0 / 2); // 3.500000
return 0;
}
比较运算符
比较的结果只有两种:成立(真,C 里用 1 表示)或不成立(假,用 0)。所以比较表达式可以参与运算,也可以赋给 int:
int a = 5, b = 3;
int flag = (a > b); /* flag = 1 */
printf("%d\n", a == b); /* 0 */
经典错误:= 和 ==
必须刻进脑子
判断相等是 ==,不是 =。
= 是赋值。写成 if (x = 1) 的真实语义是:
把 1 写进 x,然后判断 x 是否为真(1 为真)→ 条件几乎总是成立,而且 x 被你改成了 1。
这是 C 里最经典的逻辑 bug 之一。阅读时把常量写在左边可以帮忙防坑:
if (1 == x) 若误写成 if (1 = x) 会直接编译失败。逻辑运算符与短路
&&与:两边都真才真||或:有一边真就真!非:真变假,假变真
短路求值:对 A && B,若 A 已经为假,B 不会执行;
对 A || B,若 A 已经为真,B 也不会执行。这可以写保护:
#include <stdio.h>
int main(void)
{
int age = 20;
int has_card = 1; // 1 表示有
/* 先判断指针/下标合法,再解引用——利用短路避免崩溃 */
int arr[3] = {1,2,3};
int i = 5;
if (i >= 0 && i < 3 && arr[i] > 0)
{
/* 能安全走到这里 */
}
if (age >= 18 && has_card)
{
printf("可以进入\n");
}
else
{
printf("不可以进入\n");
}
return 0;
}
赋值运算符(写代码会一直用)
| 写法 | 等价于 | 意思 |
|---|---|---|
n += 3 | n = n + 3 | 加 3 再存回 |
n -= 2 | n = n - 2 | 减 2 |
n *= 2 | n = n * 2 | 乘 2 |
n /= 2 | n = n / 2 | 除 2 |
n %= 3 | n = n % 3 | 模 3 |
int sum = 0;
sum += 10; /* 累加,极常用 */
sum += 5; /* 15 */
运算优先级(够用记忆)
从高到低大致是:
()括号! ++ --等一元运算* / %+ -- 比较
< > == ... &&||=赋值
拿不准就加括号,代码更清楚,也不会算错。
易错点汇总
本课四颗雷
7/2结果是 3,不是 3.5==比较,=赋值%两边必须是整数- 浮点比较不要写
f == 0.3,有误差;可比较差值是否很小
单片机场景 · 运算符:条件与赋值
算术得到数值,比较与逻辑运算得到真假。先判断条件,再执行赋值。
边界与验证:c 先是 8,条件成立后变成 2。== 比较,= 赋值;& 不等于逻辑与 &&。
int a = 5, b = 3;
int c = a + b;
if (a > b && b > 0) {
c = a - b;
}
本课过关
必做表达式 9 / 2 的值是?
逐步解析
运算规则:先看操作数类型。9 和 2 都是 int,所以走整数除法——只保留商的整数部分,余数直接丢掉(不是四舍五入)。9÷2=4.5,丢掉 0.5 得到 4。若写 9.0/2 或 (double)9/2,就会提升为浮点除法,得到 4.5。取余用 %:9%2=1。记法:整数 / 整数 = 整数;只要有一边是浮点,结果才是浮点。
必做作业
- 计算并写出结果:10/3、10%3、2*3+1、!(5>3)。
- 成绩 score 及格线 60,写出「不及格」的 if 条件。
- 找出 bug:if (score = 100) printf("满分");
先自己写完,再点开看解答
1:逐步算
- 10/3:整数除 → 3(余 1 丢掉)
- 10%3:余数 → 1
- 2*3+1:先乘 → 7
- !(5>3):5>3 为真(1),!1 → 0
2:不及格条件
if (score < 60)
{
printf("不及格\n");
}3:bug 分析:if (score = 100) 把 100 写入 score,表达式值为 100(真),永远打印「满分」,且 score 被改成 100。正确写法是 if (score == 100)。很多编译器会警告 “suggest parentheses around assignment used as truth value”。
学完去哪
下一课:让程序「做选择」——if / else。