C++ 也有and、or、not关键字?吓一跳吧!
C++ 也有and、or、not关键字?吓一跳吧!
一、and、or、not关键字详解
在 C++ 中,and、or 和 not 是作为 替代标记 引入的。它们分别等价于 C++ 中传统的逻辑运算符 &&(逻辑与)、||(逻辑或)和 !(逻辑非)。它们的存在主要是为了提高代码的可读性,尤其是在涉及多个逻辑运算时。
1、 and 关键字(逻辑与)
- 功能: 执行逻辑与操作。当且仅当两个操作数都为真时,结果才为真。
- 等价运算符:
&& - 短路求值: 与
&&一样,and也使用短路求值。如果第一个操作数为假,则不会计算第二个操作数。
示例代码:
bool isSunny =true;bool isWarm =true;if(isSunny and isWarm){// 等价于 if (isSunny && isWarm) cout <<"Perfect weather for a picnic!"<< endl;}真值表:
| 操作数 A | 操作数 B | A and B |
|---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
2、or 关键字(逻辑或)
- 功能: 执行逻辑或操作。当至少一个操作数为真时,结果就为真。
- 等价运算符:
|| - 短路求值: 与
||一样,or也使用短路求值。如果第一个操作数为真,则不会计算第二个操作数。
示例代码:
bool hasCoffee =false;bool hasTea =true;if(hasCoffee or hasTea){// 等价于 if (hasCoffee || hasTea) cout <<"You have a hot beverage."<< endl;}真值表:
| 操作数 A | 操作数 B | A or B |
|---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
3、 not 关键字(逻辑非)
- 功能: 执行逻辑非操作。对操作数进行取反。
- 等价运算符:
!
示例代码:
bool doorLocked =true;if(not doorLocked){// 等价于 if (!doorLocked) cout <<"Warning: Door is unlocked!"<< endl;}真值表:
| 操作数 A | not A |
|---|---|
true | false |
false | true |
4、总结与注意事项
- 等价性:
and、or、not在功能上与&&、||、!完全相同,可以互换使用。 - 可读性: 它们的主要优势在于提高代码的可读性,尤其是在复杂的逻辑表达式中。例如
(a > b) and (c < d) or not e可能比(a > b) && (c < d) || !e更容易阅读。 - 兼容性: 这些替代标记是 C++ 标准的一部分。它们不是 C 语言的关键字。因此,在纯 C 代码中使用它们会导致编译错误。在 C++ 中,它们被广泛支持。
- 头文件: 在早期版本的 C++ 中,可能需要包含
<ciso646>头文件来使用这些替代标记。但在现代 C++ 标准(如 C++11 及以后)中,这些关键字是核心语言的一部分,通常不需要显式包含该头文件。 - 使用建议: 选择使用
and/or/not还是&&/||/!主要取决于个人或团队的编码风格约定。重要的是在项目中保持一致性。
二、示例
#include<iostream>#include<string>usingnamespace std;// 定义一个用户结构体structUser{int age;bool isAdmin;bool hasSubscription;bool isBanned;};// 函数:检查用户是否有访问权限boolhasAccess(const User& user){// 年龄必须在 18 到 65 岁之间bool ageValid =(user.age >=18)and(user.age <=65);// 用户是管理员或有订阅,且未被封禁bool statusValid =(user.isAdmin or user.hasSubscription)andnot user.isBanned;// 特殊规则:如果年龄是 21 岁,需要额外检查(非管理员需有订阅)bool specialCheck =not(user.age ==21andnot user.isAdmin andnot user.hasSubscription);// 最终权限:年龄有效、状态有效,且满足特殊规则return ageValid and statusValid and specialCheck;}intmain(){// 创建测试用户 User user1 ={25,true,false,false};// 管理员,未封禁 User user2 ={20,false,true,false};// 有订阅,年龄有效 User user3 ={21,false,false,false};// 年龄 21,但无订阅// 测试权限 cout <<"User1 Access: "<<hasAccess(user1)<< endl;// 输出 1 (true) cout <<"User2 Access: "<<hasAccess(user2)<< endl;// 输出 1 (true) cout <<"User3 Access: "<<hasAccess(user3)<< endl;// 输出 0 (false)return0;}运行结果
User1 Access:1 User2 Access:1 User3 Access:0
代码解释
- 结构体和条件定义:
- 我们定义了一个
User结构体,包含年龄、管理员状态、订阅状态和封禁状态。 - 在
hasAccess函数中,使用and、or和not构建多个逻辑条件:ageValid:检查年龄是否在 18 ≤ age ≤ 65 18 \leq \text{age} \leq 65 18≤age≤65 范围内。statusValid:用户是管理员或拥有订阅,且未被封禁(not user.isBanned)。specialCheck:特殊规则,如果年龄是 21 岁,则必须不是非管理员且无订阅的情况(避免漏洞)。
- 我们定义了一个
- 逻辑组合:
- 最终权限返回
ageValid and statusValid and specialCheck,确保所有条件同时满足。 - 在
main函数中,测试不同用户案例:user1:年龄 25,是管理员,满足所有条件(输出 true)。user2:年龄 20,有订阅,满足条件(输出 true)。user3:年龄 21,无订阅且非管理员,触发特殊规则失败(输出 false)。
- 最终权限返回