逻辑运算符:组合多个条件的“和、或、非”
困难80逻辑运算符:学会用“并且、或者、不”来组合条件
在编程中,很多时候我们不仅要判断一个条件,还需要把好几个条件组合起来,形成更复杂的判断。比如老师要评选“三好学生”,要求“成绩优秀 并且 品德好”,或者妈妈允许你玩游戏,条件是“写完作业 或者 是周末”。这时候就需要逻辑运算符出场啦!它们就像语文里的“并且”“或者”“不”,帮我们把多个条件拼在一起,让程序做出更聪明的决定。
C++ 中有三个逻辑运算符,分别是 &&(逻辑与)、||(逻辑或)和 !(逻辑非)。下面我们一个一个来认识它们。
逻辑与 && —— 两个条件都得真
逻辑与的操作就像妈妈对你说:“写完作业 并且 洗完碗 才能看电视。” —— 两个条件必须同时满足,结果才为真;只要有一个没做到,结果就是假。
在 C++ 里,&& 的左右两边各放一个条件(都可以是 true 或 false),只有两边都是 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
试着修改 score、age 等变量的值,看看输出怎么变化,你就能更清楚逻辑运算符的用法啦!
相关知识点指引
- 比较运算符:
==、!=、>、<、>=、<=,它们常常和逻辑运算符一起用,产生true或false。 - if 语句:使用逻辑运算符组合条件后,通常配合
if/else来执行不同的代码分支。 - 短路求值:当
&&左边为假时,右边不再执行;当||左边为真时,右边不再执行。这可以提高效率,有时也会影响程序逻辑(比如右边有函数调用时)。 - 逻辑运算符的优先级:
!最高,&&其次,||最低。建议用括号明确顺序。
掌握了逻辑运算符,你的程序就能像人一样“想各种情况”,做出更智能的判断。快去试试用它们写一个自己生活中的判断逻辑吧!
例题精讲
已知 int a = 5, b = 10, c = 3; 判断表达式 (a > b) && (c < b) 的值为?
以下哪个表达式与 !(x > 5 || y < 3) 的逻辑结果相同?
在C++中,表达式 (5 > 3) || (2 > 4) 的值为 true。
请补全以下代码,使得当变量 score 大于等于90并且 age 小于15时,输出"优秀",否则不输出。
if (___ ) {
cout << "优秀";
}以下程序判断输入整型变量n是否为负数或偶数。补全if条件:
if (___ ) {
cout << "满足条件";
}