当前位置: 首页 > article >正文

C++Primer逻辑和关系运算符

欢迎阅读我的 【C++Primer】专栏

专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!

在这里插入图片描述
在这里插入图片描述

目录

  • 4.3逻辑和关系运算符
    • 逻辑与和逻辑或运算符
    • 逻辑非运算符
    • 关系运算符

4.3逻辑和关系运算符

关系运算符作用于算术类型或指针类型,逻辑运算符作用于任意能转换成布尔值的类型。逻辑运算符和关系运算符的返回值都是布尔类型。值为0的运算对象(算术类型或指
针类型)表示假,否则表示真。对于这两类运算符来说,运算对象和求值结果都是右值。

表4.2:逻辑运算符和关系运算符

结合律运算符功能用法
!逻辑非!expr
<小于expr < exp
<=小于等于expr <= exp
>大于expr > expr
>=大于等于expr >= expr
==相等expr==expr
!=不相等expr != expr
&&逻辑与expr && expr
||逻辑或expr || expr

逻辑与和逻辑或运算符

对于逻辑与运算符(&&)来说,当且仅当两个运算对象都为真时结果为真;对于逻辑或运算符(||)来说,只要两个运算对象中的一个为真结果就为真。

逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。这种策略称为短路求值(short circuit evaluation)。

  • 对于逻辑与运算符来说,当且仅当左侧运算对象为真时才对右侧运算对象求值。
  • 对于逻辑或运算符来说,当且仅当左侧运算对象为假时才对右侧运算对象求值。

举一个使用逻辑或运算符的例子,假定有一个存储着若干string对象的vector对象,要求输出string对象的内容并且在遇到空字符串或者以句号结束的字符串时进行换行。使用基于范围的for循环处理string对象中的每个元素:

// s是对常量的引用;元素既没有被拷贝也不会被改变
for(const auto &s:text){  // 对于text的每一个元素cout<<s;// 输出当前元素//遇到空字符争或者以句号结束的字符串进行换行if(s.empty() || s[s.stze()-1]==.)cout<<endl;elsecout<<““;//否则用空格隔开
}

输出当前元素后检查是否需要换行。if语句的条件部分首先检查s是否是一个string,如果是,则不论右侧运算对象的值如何都应该换行。只有当string对象非空时才需要求第二个运算对象的值,也就是检查string对象是否是以句号结束的。在这条表达式中,利用逻辑或运算符的短路求值策略确保只有当s非空时才会用下标运算符去访间它。值得注意的是,s被声明成了对常量的引用。因为text的元素是string对象,可能非常大,所以将s声明成引用类型可以避免对元素的拷贝;又因为不需要对string对象做写操作,所以s被声明成对常量的引用。

逻辑非运算符

逻辑非运算符(!)将运算对象的值取反后返回,之前我们曾经使用过这个运算符。下面再举一个例子,假设vec是一个整数类型的vector对象,可以使用逻辑非运算符将empty函数的返回值取反从而检查vec是否含有元素:

//输出vec的首元素(如果有的话)
if(vec.empty())cout<<vec[0];

子表达式

!vec.empty.()

当empty函数返回假时结果为真。

关系运算符

顾名思义,关系运算符比较运算对象的大小关系并返回布尔值。关系运算符都满足左结合律。

因为关系运算符的求值结果是布尔值,所以将几个关系运算符连写在一起会产生意想不到的结果:

//错误!这个条件居然拿i<j的布尔值结果和k比较!
if(i<j<k) //若K大于1则为真!

if语句的条件部分首先把i、j和第一个<运算符组合在一起,其返回的布尔值再作为第二个<运算符的左侧运算对象。也就是说,k比较的对象是第一次比较得到的那个或真或假的结果!要想实现我们的目的,其实应该使用下面的表达式:

//正确;当i小j并小于k时条件为真
if(i < j && j< k) {/**/}## 相等性测试与布尔字面值如果想测试一个算术对象或指针对象的真值,最直接的方法就是将其作为if语句的条件:```cpp
if(val){/*...*/}  //如果val是任意的非0值,条件为真
if(!val){/*...*/} //如果val是0,条件为真

在上面的两个条件中,编译器都将val转换成布尔值。如果val非0则第一个条件为真,如果val的值为0则第二个条件为真。

有时会试图将上面的真值测试写成如下形式:

if(val==true){/*…*/}//只有当val等于1时条件才为真!

但是这种写法存在两个问题:首先,与之前的代码相比,上面这种写法较长而且不太直接(尽管大家都认为缩写的形式对初学者来说有点难理解);更重要的一点是,如果val不是布尔值,这样的比较就失去了原来的意义。

如果val不是布尔值,那么进行比较之前会首先把true转换成val的类型。也就是说,如果val不是布尔值,则代码可以改写成如下形式:

if(val==1){/* ... */}

正如我们已经非常熟悉的那样,当布尔值转换成其他算术类型时,false转换成0而true转换成1。如果真想知道val的值是否是1,应该直接写出1这个数值来,而不要与true比较。

相关文章:

C++Primer逻辑和关系运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

从BIO到NIO:Java IO的进化之路

引言 在 Java 编程的世界里&#xff0c;输入输出&#xff08;I/O&#xff09;操作是基石般的存在&#xff0c;从文件的读取写入&#xff0c;到网络通信的数据传输&#xff0c;I/O 操作贯穿于各种应用程序的核心。BIO&#xff08;Blocking I/O&#xff0c;阻塞式 I/O&#xff0…...

VMware Win10下载安装教程(超详细)

《网络安全自学教程》 从MSDN下载系统镜像&#xff0c;使用 VMware Workstation 17 Pro 安装 Windows 10 consumer家庭版 和 VMware Tools。 Win10下载安装 1、下载镜像2、创建虚拟机3、安装操作系统4、配置系统5、安装VMware Tools 1、下载镜像 到MSDN https://msdn.itellyou…...

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…...

3-kafka服务端之控制器

文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controler&#xff09;&#xff0c;它负责管理整个集群中所有分区和副本的状态。…...

e2studio开发RA2E1(5)----GPIO输入检测

e2studio开发RA2E1.5--GPIO输入检测 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置GPIO口配置按键口配置按键口&Led配置R_IOPORT_PortRead()函数原型R_IOPORT_PinRead()函数原型代码 概述 本篇文章主要介绍如何…...

[LeetCode]全排列I,II

全排列I 给定一个不含重复数字的整数数组 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xff1…...

【Elasticsearch】parent aggregation

在Elasticsearch中&#xff0c;Parent Aggregation是一种特殊的单桶聚合&#xff0c;用于选择具有指定类型的父文档&#xff0c;这些类型是通过一个join字段定义的。以下是关于Parent Aggregation的详细介绍&#xff1a; 1.基本概念 Parent Aggregation是一种聚合操作&#x…...

Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

C# 使用ADO.NET访问数据全解析

.NET学习资料 .NET学习资料 .NET学习资料 在 C# 的应用开发中&#xff0c;数据访问是极为关键的部分。ADO.NET作为.NET 框架下用于数据访问的核心技术&#xff0c;能够帮助开发者便捷地与各类数据源进行交互。本文将深入剖析ADO.NET&#xff0c;带你掌握使用 C# 通过ADO.NET访…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter4-变量、作用域与内存

四、变量、作用域与内存 正如 ECMA-262 所规定的&#xff0c;JavaScript 变量是松散类型的&#xff0c;而且变量不过就是特定时间点一个特定值的名称而已。由于没有规则定义变量必须包含什么数据类型&#xff0c;变量的值和数据类型在脚本生命期内可以改变。 ECMAScript 变量可…...

Unity扩展编辑器使用整理(一)

准备工作 在Unity工程中新建Editor文件夹存放编辑器脚本&#xff0c; Unity中其他的特殊文件夹可以参考官方文档链接&#xff0c;如下&#xff1a; Unity - 手册&#xff1a;保留文件夹名称参考 (unity3d.com) 一、菜单栏扩展 1.增加顶部菜单栏选项 使用MenuItem&#xff…...

如何查看:Buildroot所使用Linux的版本号、gcc交叉编译工具所使用的Linux的版本号、开发板上运行的Linux系统的版本号

定义编号①②③的含义 将“Buildroot所使用Linux的版本号”编号为① 将“gcc交叉编译工具所使用的Linux的版本号”编号为② 将“开发板上运行的Linux系统的版本号”编号为③ 查看①和②的共同方法(通过sysroot查看) 由于此二者都有目录sysroot&#xff0c;而通过目录sysroot…...

Java实战经验分享

1. 项目优化与性能提升 面试问题&#xff1a; 聊聊你印象最深刻的项目&#xff0c;或者做了哪些优化 你在项目中如何解决缓存穿透问题&#xff1f; 缓存穿透是我们做缓存优化时最常遇到的问题&#xff0c;特别是当查询的对象在数据库中不存在时&#xff0c;缓存层和数据库都会…...

python安装包,!pip 和不加!命令,功能区别一览

python安装包&#xff0c;!pip 和不加!命令&#xff0c;功能区别一览 1. !pip2. pip&#xff08;不加 !&#xff09;3. 区别总结4. 推荐用法5. 注意事项6. 总结 在 Jupyter Notebook 或 IPython 环境中&#xff0c;!pip 和 pip 的功能有所不同&#xff0c;主要体现在执行环境和…...

html转PDF文件最完美的方案(wkhtmltopdf)

目录 需求 一、方案调研 二、wkhtmltopdf使用 如何使用 文档简要说明 三、后端服务 四、前端服务 往期回顾 需求 最近在做报表类的统计项目&#xff0c;其中有很多指标需要汇总&#xff0c;网页内容有大量的echart图表&#xff0c;做成一个网页去浏览&#xff0c;同时…...

我最近在干什么【2】

前言 这系列的上一篇是2024.12.05写的&#xff0c;现在是2025.02.06&#xff0c;这都两个月&#x1f914;小久。 不是完整全面的技术分享&#xff0c;话题聚焦个人成长&#xff08;学的技术、了解到的信息、看的书……&#xff09; 方面。文章偏意识流点&#xff0c;单纯分享我…...

deepseek本地部署

DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型&#xff0c;提供了灵活的本地部署方案&#xff0c;让用户能够在本地环境中高效运行模型&#xff0c;同时保护数据隐私&#xff0c;这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…...

【Reading Notes】Favorite Articles from 2025

文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 极越之后&#xff0c;中国车市只会倒下更多人&#xff08;2025年01月01日&#xff09; 在这波枪林弹雨中&#xff0c;合资品牌中最…...

配置@别名路径,把@/ 解析为 src/

路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js &#xff0c;内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定&#xff1a; 使用 表示src文件所在路径: path.resolve(__dirname,src)…...

【LeetCode 刷题】回溯算法(2)-分割问题

此博客为《代码随想录》二叉树章节的学习笔记&#xff0c;主要内容为回溯算法分割问题相关的题目解析。 文章目录 131.分割回文串93.复原IP地址 131.分割回文串 题目链接 class Solution:def partition(self, s: str) -> List[List[str]]:res, path [], []def check(s: …...

AJAX笔记原理篇

黑马程序员视频地址&#xff1a; AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p33https://www.bilibili.com/video/BV1MN411y7pw?vd_sour…...

一表总结 Java 的3种设计模式与6大设计原则

设计模式通常分为三大类&#xff1a;创建型、结构型和行为型。 创建型模式&#xff1a;主要用于解决对象创建问题结构型模式&#xff1a;主要用于解决对象组合问题行为型模式&#xff1a;主要用于解决对象之间的交互问题 创建型模式 创建型模式关注于对象的创建机制&#xf…...

[paddle] 矩阵的分解

特征值 设 A A A 是一个 n n n \times n nn 的方阵&#xff0c; λ \lambda λ 是一个标量&#xff0c; v \mathbf{v} v 是一个非零向量。如果满足以下方程&#xff1a; A v λ v A\mathbf{v} \lambda\mathbf{v} Avλv 则称 λ \lambda λ 为矩阵 A A A 的一个 特征值…...

极限的深入探讨:从概念到应用的完整指南

极限的深入探讨&#xff1a;从概念到应用的完整指南 一、历史背景与发展 1. 极限概念的演变 在维尔斯特拉斯&#xff08;Karl Weierstrass&#xff0c;1815-1897&#xff09;提出他的严格定义之前&#xff0c;极限概念经历了漫长的发展过程&#xff1a; 古希腊时期&#xf…...

康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案

随着自动驾驶技术的快速发展&#xff0c;车辆准确感知周围环境的能力变得至关重要。BEV&#xff08;Birds-Eye-View&#xff0c;鸟瞰图&#xff09;感知技术&#xff0c;以其独特的视角和强大的数据处理能力&#xff0c;正成为自动驾驶领域的一大研究热点。 一、BEV感知技术概…...

UE学习日志#23 C++笔记#9 编码风格

注&#xff1a;此文章为学习笔记&#xff0c;只记录个人不熟悉或备忘的内容 1 为代码编写文档 1.1 使用注释的原因 1.说明用途的注释 应该注释的信息&#xff1a;输入&#xff0c;输出含义&#xff0c;参数的类型含义&#xff0c;错误条件和处理&#xff0c;预期用途&#x…...

更换IP属地会影响网络连接速度吗

在数字化时代&#xff0c;网络连接速度对于个人用户和企业来说都至关重要。无论是日常浏览网页、观看视频&#xff0c;还是进行在线办公、游戏娱乐&#xff0c;网络速度都直接影响着我们的体验。而IP属地&#xff0c;作为网络连接中的一个重要元素&#xff0c;其变动是否会引发…...

深入探索 C++17 特征变量模板 (xxx_v)

文章目录 一、C++类型特征的前世今生二、C++17特征变量模板闪亮登场三、常见特征变量模板的实际应用(一)基本类型判断(二)指针与引用判断四、在模板元编程中的关键作用五、总结与展望在C++的持续演进中,C++17带来了许多令人眼前一亮的特性,其中特征变量模板(xxx_v)以其…...

C# 中 Guid类 使用详解

总目录 前言 C# 中的 Guid 类&#xff08;全局唯一标识符&#xff0c;Globally Unique Identifier&#xff09;用于生成和操作 128 位的唯一标识符。它在需要唯一标识的场景&#xff08;如数据库主键、分布式系统等&#xff09;中广泛使用。 一、什么是 Guid Guid&#xff08…...