CC++ & Algorithm

逻辑运算符:组合多个条件的“和、或、非”

困难80
语言版本:C++Python
概述:逻辑运算符可以把多个条件组合在一起,形成更复杂的判断,比如“及格并且超过90分”。

逻辑运算符:学会用“并且、或者、不”来组合条件

在编程中,很多时候我们不仅要判断一个条件,还需要把好几个条件组合起来,形成更复杂的判断。比如老师要评选“三好学生”,要求“成绩优秀 并且 品德好”,或者妈妈允许你玩游戏,条件是“写完作业 或者 是周末”。这时候就需要逻辑运算符出场啦!它们就像语文里的“并且”“或者”“不”,帮我们把多个条件拼在一起,让程序做出更聪明的决定。

C++ 中有三个逻辑运算符,分别是 &&(逻辑与)、||(逻辑或)和 !(逻辑非)。下面我们一个一个来认识它们。

逻辑与 && —— 两个条件都得真

逻辑与的操作就像妈妈对你说:“写完作业 并且 洗完碗 才能看电视。” —— 两个条件必须同时满足,结果才为真;只要有一个没做到,结果就是假。

在 C++ 里,&& 的左右两边各放一个条件(都可以是 truefalse),只有两边都是 true,整个表达式才是 true。可以用一张“真值表”来记住:

左边条件右边条件结果(左边 && 右边)

生活例子:

  • 体育课:天气晴朗 并且 操场没积水,才能上户外课。
  • 零花钱:考试及格 并且 在家帮忙做家务,才能拿到 10 元奖励。

代码示例:

#include <iostream>
using namespace std;

int main() {
    int score = 92;              // 考试分数
    bool didHomework = true;     // 是否做了作业

    // 逻辑与:分数 >= 90 并且 做了作业,才给奖励
    bool reward = (score >= 90) && didHomework;
    cout << "是否获得奖励?" << reward << endl; // 输出 1(真)

    // 如果把分数改成 85
    score = 85;
    reward = (score >= 90) && didHomework;
    cout << "分数85时是否获得奖励?" << reward << endl; // 输出 0(假)
    
    return 0;
}

逻辑或 || —— 两个条件只要一个真就行

逻辑或有点像老师说:“考试前 10 名 或者 拿到进步奖 就能免作业。” —— 你只要满足其中一个条件,结果就为真。只有两个条件都不满足时,结果才是假。

真值表长这样:

| 左边条件 | 右边条件 | 结果(左边 || 右边) | |----------|----------|----------------------| | 真 | 真 | 真 | | 真 | 假 | 真 | | 假 | 真 | 真 | | 假 | 假 | 假 |

生活例子:

  • 看电影:妈妈买票 或者 爸爸买票,你就能进场。
  • 放学回家:爸爸来接 或者 自己坐公交车,只要能到家就行。

代码示例:

#include <iostream>
using namespace std;

int main() {
    bool sunny = false;   // 是否晴天
    bool cloudy = true;   // 是否多云

    // 逻辑或:晴天 或者 多云,都算“适合出游”
    bool niceWeather = sunny || cloudy;
    cout << "是否适合出游?" << niceWeather << endl; // 输出 1(真,因为多云为真)

    // 如果两个都是 false
    sunny = false;
    cloudy = false;
    niceWeather = sunny || cloudy;
    cout << "两个都不合适时?" << niceWeather << endl; // 输出 0(假)
    
    return 0;
}

逻辑非 ! —— 把结果反过来

逻辑非就像说反话:“不是 小学生” —— 如果你是小学生,加上“不是”就变成了假;如果你不是小学生,加上“不是”就变成了真。! 只要放在一个条件前面,就会把这个条件的结果取反:真变假,假变真。

真值表最简单:

原条件!原条件

生活例子:

  • 老师说:“没交作业的同学站起来。” —— 这里的“没交”就是对“交了作业”取反。
  • 天气预报:“明天 下雨” —— 如果下雨,这个说法就是假;如果不下雨,就是真。

代码示例:

#include <iostream>
using namespace std;

int main() {
    bool isRaining = false;   // 是否正在下雨

    // 逻辑非:如果下雨,!isRaining 就是假;如果没下雨,!isRaining 就是真
    cout << "现在是否没下雨?" << !isRaining << endl; // 输出 1(真)

    isRaining = true;
    cout << "现在是否没下雨?" << !isRaining << endl; // 输出 0(假)
    
    return 0;
}

新手最容易犯的 3 个错误

❌ 错误1:把 && 写成 &,把 || 写成 |

&| 在 C++ 中也有作用,但它们是按位运算符,处理二进制位,不是逻辑运算。如果写成一个字符,程序可能不会报错,但行为会完全变样!
正确写法: 两个字符连在一起,中间不能有空格。

❌ 错误2:忘记加括号,导致优先级混乱

逻辑运算符的优先级比比较运算符(比如 >==)低,但比赋值运算符 = 高。比如:

int age = 15;
// 想判断 age 是不是在 10 到 20 之间
bool result = age > 10 && age < 20;   // 这样写没问题,因为 > 优先级高于 &&
// 但为了清楚,最好加括号:
bool result = (age > 10) && (age < 20);

如果不加括号,有时会得到意想不到的结果。建议 把每个条件用括号包起来,既清晰又安全。

❌ 错误3:混淆“与”和“或”的逻辑

比如想表达“年龄不在 6 到 12 之间”,新手可能会写成 age < 6 && age > 12 —— 这永远不可能为真,因为一个数不可能同时小于 6 又大于 12。正确的写法是 (age < 6) || (age > 12)!(age >= 6 && age <= 12)

完整示例:学生获奖与活动资格判断

这个例子综合使用了三个逻辑运算符,判断一个学生是否能获得“优秀学员奖”以及能否参加某个活动。

#include <iostream>
using namespace std;

int main() {
    // 学生的信息
    int score = 95;                 // 期末考试分数
    bool hasPerfectAttendance = true;  // 是否全勤
    int age = 10;                   // 年龄
    bool isWeekend = false;         // 是否是周末

    // 逻辑与:成绩>=90 并且 全勤 → 获得优秀学员奖
    bool canGetAward = (score >= 90) && hasPerfectAttendance;
    cout << "是否获得优秀学员奖?" << canGetAward << endl; // 1 (真)

    // 逻辑或:年龄小于6岁 或者 年龄大于12岁 → 不能参加活动
    bool notAllowed = (age < 6) || (age > 12);
    cout << "是否不能参加活动?" << notAllowed << endl;   // 0 (假)

    // 逻辑非:今天不是周末?取反 isWeekend
    cout << "今天不是周末?" << !isWeekend << endl;       // 1 (真)

    // 更复杂的组合:如果今天不是周末并且年龄在6~12之间,才能参加活动
    bool canJoinActivity = !isWeekend && (age >= 6 && age <= 12);
    cout << "能否参加今天的活动?" << canJoinActivity << endl; // 1 (真)

    return 0;
}

运行结果:

是否获得优秀学员奖?1
是否不能参加活动?0
今天不是周末?1
能否参加今天的活动?1

试着修改 scoreage 等变量的值,看看输出怎么变化,你就能更清楚逻辑运算符的用法啦!

相关知识点指引

  • 比较运算符==!=><>=<=,它们常常和逻辑运算符一起用,产生 truefalse
  • if 语句:使用逻辑运算符组合条件后,通常配合 if / else 来执行不同的代码分支。
  • 短路求值:当 && 左边为假时,右边不再执行;当 || 左边为真时,右边不再执行。这可以提高效率,有时也会影响程序逻辑(比如右边有函数调用时)。
  • 逻辑运算符的优先级! 最高,&& 其次,|| 最低。建议用括号明确顺序。

掌握了逻辑运算符,你的程序就能像人一样“想各种情况”,做出更智能的判断。快去试试用它们写一个自己生活中的判断逻辑吧!

例题精讲

1单选题

已知 int a = 5, b = 10, c = 3; 判断表达式 (a > b) && (c < b) 的值为?

Atrue
Bfalse
C1
D0
2单选题

以下哪个表达式与 !(x > 5 || y < 3) 的逻辑结果相同?

Ax <= 5 && y >= 3
Bx <= 5 || y >= 3
Cx > 5 && y < 3
Dx > 5 || y < 3
3判断题

在C++中,表达式 (5 > 3) || (2 > 4) 的值为 true。

4填空题
请补全以下代码,使得当变量 score 大于等于90并且 age 小于15时,输出"优秀",否则不输出。
if (___ ) {
    cout << "优秀";
}
5填空题
以下程序判断输入整型变量n是否为负数或偶数。补全if条件:
if (___ ) {
    cout << "满足条件";
}