C++ 也有and、or、not关键字?吓一跳吧!

C++ 也有and、or、not关键字?吓一跳吧!

C++ 也有and、or、not关键字?吓一跳吧!

在这里插入图片描述

一、and、or、not关键字详解

在 C++ 中,andornot 是作为 替代标记 引入的。它们分别等价于 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操作数 BA and B
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

2、or 关键字(逻辑或)

  • 功能: 执行逻辑或操作。当至少一个操作数为真时,结果就为真。
  • 等价运算符:||
  • 短路求值:|| 一样,or 也使用短路求值。如果第一个操作数为真,则不会计算第二个操作数。

示例代码:

bool hasCoffee =false;bool hasTea =true;if(hasCoffee or hasTea){// 等价于 if (hasCoffee || hasTea) cout <<"You have a hot beverage."<< endl;}

真值表:

操作数 A操作数 BA or B
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

3、 not 关键字(逻辑非)

  • 功能: 执行逻辑非操作。对操作数进行取反。
  • 等价运算符:!

示例代码:

bool doorLocked =true;if(not doorLocked){// 等价于 if (!doorLocked) cout <<"Warning: Door is unlocked!"<< endl;}

真值表:

操作数 Anot A
truefalse
falsetrue

4、总结与注意事项

  1. 等价性:andornot 在功能上与 &&||! 完全相同,可以互换使用。
  2. 可读性: 它们的主要优势在于提高代码的可读性,尤其是在复杂的逻辑表达式中。例如 (a > b) and (c < d) or not e 可能比 (a > b) && (c < d) || !e 更容易阅读。
  3. 兼容性: 这些替代标记是 C++ 标准的一部分。它们不是 C 语言的关键字。因此,在纯 C 代码中使用它们会导致编译错误。在 C++ 中,它们被广泛支持。
  4. 头文件: 在早期版本的 C++ 中,可能需要包含 <ciso646> 头文件来使用这些替代标记。但在现代 C++ 标准(如 C++11 及以后)中,这些关键字是核心语言的一部分,通常不需要显式包含该头文件。
  5. 使用建议: 选择使用 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
在这里插入图片描述

代码解释

  1. 结构体和条件定义
    • 我们定义了一个 User 结构体,包含年龄、管理员状态、订阅状态和封禁状态。
    • hasAccess 函数中,使用 andornot 构建多个逻辑条件:
      • ageValid:检查年龄是否在 18 ≤ age ≤ 65 18 \leq \text{age} \leq 65 18≤age≤65 范围内。
      • statusValid:用户是管理员或拥有订阅,且未被封禁(not user.isBanned)。
      • specialCheck:特殊规则,如果年龄是 21 岁,则必须不是非管理员且无订阅的情况(避免漏洞)。
  2. 逻辑组合
    • 最终权限返回 ageValid and statusValid and specialCheck,确保所有条件同时满足。
    • main 函数中,测试不同用户案例:
      • user1:年龄 25,是管理员,满足所有条件(输出 true)。
      • user2:年龄 20,有订阅,满足条件(输出 true)。
      • user3:年龄 21,无订阅且非管理员,触发特殊规则失败(输出 false)。
在这里插入图片描述

Read more

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

摘要:本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求,帮助开发者真正实现OpenClaw从“能用”到“放心用”的跨越。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性能优化】 【Java生产级避坑指南:

By Ne0inhk
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》《STM32 HAL库专栏》 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言  一、实验基础说明 1.1、互斥体简介 1.2 本次实验设计思路 二、硬件原理分析(看过之前博客的可以忽略) 三、实验程序编写 3.1 互斥体 LED 驱动代码(mutex.c) 3.2.1、设备结构体定义(28-39

By Ne0inhk
Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 后端工程师扔给你一个 Swagger (OpenAPI) 文档地址,你会怎么做? 1. 对着文档,手写 Dart Model 类(容易写错字段类型)。 2. 手写 Retrofit/Dio 的 API 接口定义(容易拼错 URL)。 3. 当后端修改了字段名,你对着报错修半天。 这是重复劳动的地狱。 swagger_dart_code_generator 可以将 Swagger (JSON/YAML) 文件直接转换为高质量的 Dart 代码,包括: * Model 类:支持 json_serializable,带 fromJson/

By Ne0inhk
Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

文章目录 * 前言 * make/makefile * 文件的三个时间 * Linux第一个小程序-进度条 * 回车和换行 * 缓冲区 * 程序的代码展示 * git指令 * 关于gitee * Linux调试器-gdb使用 * 作业部分 前言 做 Linux 开发时,你是不是也遇到过这些 “卡脖子” 时刻?写 makefile 时,明明语法没错却报错,最后发现是依赖方法行没加 Tab;想提交代码到 gitee,记不清 git add/commit/push 的 “三板斧”,还得反复搜教程;用 gdb 调试程序,输了命令没反应,才想起编译时没加-g生成 debug 版本;甚至连写个进度条,都搞不懂\r和\n的区别,导致进度条乱跳…… 其实这些问题,

By Ne0inhk