C++ 编程第二季第二课 - 教程

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

课程导航

  1. 生活中的 “逻辑”:为什么需要逻辑运算符?
  1. 三大核心逻辑运算符(与 &&、或 ||、非!):含义与用法
  1. ⚙️ 逻辑运算符的运算优先级:避免判断出错的关键
  1. 逻辑表达式的结果判断:true 与 false 的 “隐藏规则”
  1. 实战案例:用逻辑运算符解决生活场景问题
  1. ⚠️ 常见错误与避坑技巧(短路求值、优先级混淆)
  1. 下节预告: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. ⚙️ 逻辑运算符的运算优先级:避免判断出错

当一个表达式中有多个运算符(比如逻辑运算符 + 关系运算符)时,要遵守 “优先级规则”,否则会算错结果。

关键优先级顺序(从高到低)

  1. 括号 ():括号里的表达式先计算(最优先,推荐用括号明确顺序);
  1. 非!:先算 “非” 运算;
  1. 关系运算符:>、<、>=、<=、==、!=(比如先算 a>3,再算逻辑运算);
  1. 与 &&:再算 “与” 运算;
  1. 或 ||:最后算 “或” 运算。

易错案例:不加括号导致结果错误

比如想判断 “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。

下节课我们会学习:

  1. ASCII 编码的基本规则(常用字符的编号规律);
  1. 字符与数字的转换(比如 'A' + 1 为什么等于 'B');
  1. 字符处理实战(判断大小写字母、转换大小写、统计字符类型)。

学会 ASCII 编码,你就能理解字符的 “本质”,轻松实现 “大小写转换”“字符分类统计” 等功能,让字符操作更灵活!期待下节课一起揭秘字符背后的 “数字密码”~

posted @ 2025-12-22 20:51  yangykaifa  阅读(0)  评论(0)    收藏  举报