C++ 编程第二季第二课 - 教程
C++ 编程第二季第二课:逻辑运算符详解(组合条件的魔法)

课程导航
- 生活中的 “逻辑”:为什么需要逻辑运算符?
- 三大核心逻辑运算符(与 &&、或 ||、非!):含义与用法
- ⚙️ 逻辑运算符的运算优先级:避免判断出错的关键
- 逻辑表达式的结果判断:true 与 false 的 “隐藏规则”
- 实战案例:用逻辑运算符解决生活场景问题
- ⚠️ 常见错误与避坑技巧(短路求值、优先级混淆)
- 下节预告:ASCII 编码与字符处理(揭秘字符背后的 “数字密码”)
1. 生活中的 “逻辑”:为什么需要逻辑运算符?
之前我们学过单条件判断,比如 “如果分数大于 60,就输出‘及格’”:
if (score > 60) {
printf("及格\n");
}
但生活中很多判断需要 “多个条件组合”:
- 考试奖励:“分数大于 90 并且 排名前 10”,才能获得奖学金;
- 电影购票:“年龄小于 12 岁 或者 大于 60 岁”,可以享受半价;
- 门禁验证:“如果 不是 本小区居民”,就不能进入。
这些 “并且、或者、不是” 的逻辑,需要用 逻辑运算符 来实现。它就像 “条件组合工具”,能把简单条件拼成复杂条件,让判断更灵活!
2. 三大核心逻辑运算符:含义与用法
C++ 中有三种最常用的逻辑运算符,我们结合生活场景一一讲解:
(1)“与” 运算符:&&(两个条件都满足才成立)
- 含义:相当于生活中的 “并且”,只有当 左右两个条件都为真 时,整个逻辑表达式才为真;只要有一个条件为假,结果就是假。
- 口诀:一假则假,全真才真。
- 生活案例:“考 90 分以上(条件 1)并且 出勤满 20 天(条件 2),才能评‘三好学生’”。
- 代码示例:
#include
using namespace std;
int main() {
int score = 95;
int attend = 25;
// 两个条件都满足,结果为真
if (score > 90 && attend >= 20) {
printf("可以评三好学生!\n");
} else {
printf("不满足条件哦~\n");
}
return 0;
}
运行结果:可以评三好学生!
(2)“或” 运算符:||(满足一个条件就成立)
- 含义:相当于生活中的 “或者”,只要 左右两个条件中有一个为真,整个逻辑表达式就为真;只有两个条件都为假时,结果才是假。
- 口诀:一真则真,全假才假。
- 生活案例:“年龄小于 12 岁(条件 1)或者 大于 60 岁(条件 2),可以买半价票”。
- 代码示例:
#include
using namespace std;
int main() {
int age = 10;
// 满足第一个条件,结果为真
if (age < 12 || age > 60) {
printf("可以购买半价票!\n");
} else {
printf("请购买全价票~\n");
}
return 0;
}
运行结果:可以购买半价票!
(3)“非” 运算符:!(否定条件,真变假、假变真)
- 含义:相当于生活中的 “不是”,用来 否定一个条件 —— 如果原条件为真,加 “!” 后变成假;原条件为假,加 “!” 后变成真。
- 口诀:真变假,假变真。
- 生活案例:“如果不是周末(原条件:是周末),就要上学”。
- 代码示例:
#include
using namespace std;
int main() {
bool is_weekend = false; // false 表示“不是周末”
// 否定原条件:“不是周末”变成“是周末”?
if (!is_weekend) {
printf("今天要上学哦~\n");
} else {
printf("今天可以休息!\n");
}
return 0;
}
运行结果:今天要上学哦~
三种运算符对比表
运算符 | 名称 | 含义 | 口诀 | 例子(a=5, b=3) | 结果 |
&& | 与 | 两个都满足 | 一假则假,全真才真 | a>3 && b>5 | 假 |
|| | 或 | 满足一个 | 一真则真,全假才假 | a>3 || b>5 | 真 |
! | 非 | 否定条件 | 真变假,假变真 | !(a>3) | 假 |
3. ⚙️ 逻辑运算符的运算优先级:避免判断出错
当一个表达式中有多个运算符(比如逻辑运算符 + 关系运算符)时,要遵守 “优先级规则”,否则会算错结果。
关键优先级顺序(从高到低)
- 括号 ():括号里的表达式先计算(最优先,推荐用括号明确顺序);
- 非!:先算 “非” 运算;
- 关系运算符:>、<、>=、<=、==、!=(比如先算 a>3,再算逻辑运算);
- 与 &&:再算 “与” 运算;
- 或 ||:最后算 “或” 运算。
易错案例:不加括号导致结果错误
比如想判断 “a 大于 3 并且 b 大于 2,或者 c 等于 4”(a=5, b=1, c=4):
- 正确逻辑:(a>3 && b>2) || (c==4) → (真 && 假) || 真 → 假 || 真 → 真;
- 错误逻辑(不加括号):a>3 && b>2 || c==4 → 按优先级先算 “与”,再算 “或”,结果也是真(这次巧合对了,但下次可能错!);
再比如 “a 大于 3 并且(b 大于 2 或 c 等于 4)”:
- 正确逻辑:a>3 && (b>2 || c==4) → 真 && (假 || 真) → 真;
- 错误逻辑(不加括号):a>3 && b>2 || c==4 → 假 || 真 → 真(结果对,但逻辑表达错了!)。
结论:当表达式有多个条件时,尽量用括号 () 明确计算顺序,避免依赖优先级猜结果!
4. 逻辑表达式的结果判断:true 与 false 的 “隐藏规则”
在 C++ 中,逻辑表达式的结果只有两种:真(true)或假(false),但计算机底层会用 “数字” 表示:
- 真(true):用 非 0 的数字 表示(比如 1、2、-5 都代表真);
- 假(false):用 0 表示。
比如:
// 5 是非 0,代表真,!5 就是假(0)
printf("!5 的结果:%d\n", !5); // 输出 0
// 0 代表假,!0 就是真(1)
printf("!0 的结果:%d\n", !0); // 输出 1
// 3>2 是真(1),5<4 是假(0),1&&0 是假(0)
printf("3>2 && 5<4 的结果:%d\n", 3>2 && 5<4); // 输出 0
5. 实战案例:用逻辑运算符解决生活场景问题
案例 1:成绩等级判断(多条件组合)
需求:输入学生分数,判断等级:
- 优秀:分数 >=90 并且 <=100;
- 良好:分数 >=80 并且 <90;
- 及格:分数 >=60 并且 <80;
- 不及格:分数 <60 或者>100(无效分数也算不及格)。
代码:
#include
using namespace std;
int main() {
int score;
printf("请输入学生分数:");
scanf("%d", &score);
if (score >=90 && score <=100) {
printf("等级:优秀\n");
} else if (score >=80 && score <90) {
printf("等级:良好\n");
} else if (score >=60 && score <80) {
printf("等级:及格\n");
} else if (score <60 || score >100) {
printf("等级:不及格(或无效分数)\n");
}
return 0;
}
运行场景 1:
请输入学生分数:95
等级:优秀
运行场景 2:
请输入学生分数:55
等级:不及格(或无效分数)
案例 2:登录验证(非运算 + 与运算)
需求:模拟登录,用户名是 “student”,密码是 “123456”:
- 如果用户名不是 “student”,提示 “用户名错误”;
- 如果密码不是 “123456”,提示 “密码错误”;
- 如果用户名和密码都对,提示 “登录成功”。
代码:
#include
#include // 用于strcmp函数(比较字符串)
using namespace std;
int main() {
char username[20], password[20];
printf("请输入用户名:");
scanf("%s", username);
printf("请输入密码:");
scanf("%s", password);
// strcmp(a,b):a和b相同返回0,不同返回非0
bool user_ok = (strcmp(username, "student") == 0);
bool pwd_ok = (strcmp(password, "123456") == 0);
if (!user_ok) {
printf("用户名错误!\n");
} else if (!pwd_ok) {
printf("密码错误!\n");
} else if (user_ok && pwd_ok) {
printf("登录成功,欢迎使用!\n");
}
return 0;
}
运行场景:
请输入用户名:student
请输入密码:123456
登录成功,欢迎使用!
6. ⚠️ 常见错误与避坑技巧
错误 1:用 “=” 代替 “==” 判断相等(逻辑表达式变成赋值)
// 错误:把“==”(判断相等)写成“=”(赋值),表达式结果是 5(非0,代表真)
if (score = 5) {
printf("分数是5\n");
}
// 正确:用“==”判断相等
if (score == 5) {
printf("分数是5\n");
}
错误 2:短路求值导致的 “部分代码不执行”
逻辑运算符有 “短路” 特性:
- &&:如果左边条件为假,右边条件 不会计算(因为结果已经是假);
- ||:如果左边条件为真,右边条件 不会计算(因为结果已经是真)。
比如:
int a=3, b=5;
// 左边 a>5 是假,右边 b++ 不会执行,b 还是 5
if (a>5 && b++) {
printf("执行\n");
}
printf("b 的值:%d\n", b); // 输出 5(不是 6!)
避坑:不要在逻辑表达式里写 “改变变量值” 的代码(比如 b++),避免结果异常。
错误 3:多个条件组合时漏加括号
// 错误:想表达“(a>3 && b>2) || c==4”,但漏加括号,逻辑变了
if (a>3 && b>2 || c==4) { ... }
// 正确:用括号明确顺序
if ((a>3 && b>2) || (c==4)) { ... }
7. 下节预告:ASCII 编码与字符处理(揭秘字符背后的 “数字密码”)
今天我们学会了用逻辑运算符组合条件,能解决 “奖学金判断”“登录验证” 等复杂场景啦!下节课,我们要探索一个有趣的知识点 —— ASCII 编码与字符处理。
你有没有想过:计算机只认识 0 和 1,那它是怎么存储 “a”“B”“1” 这些字符的呢?答案就是 ASCII 编码!它给每个字符都分配了一个 “数字编号”,比如:
- 字符 'A' 对应数字 65;
- 字符 'a' 对应数字 97;
- 字符 '0' 对应数字 48。
下节课我们会学习:
- ASCII 编码的基本规则(常用字符的编号规律);
- 字符与数字的转换(比如 'A' + 1 为什么等于 'B');
- 字符处理实战(判断大小写字母、转换大小写、统计字符类型)。
学会 ASCII 编码,你就能理解字符的 “本质”,轻松实现 “大小写转换”“字符分类统计” 等功能,让字符操作更灵活!期待下节课一起揭秘字符背后的 “数字密码”~


浙公网安备 33010602011771号