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

重生之我在21世纪学C++—关系、条件、逻辑操作符

一、关系操作符

1、关系操作符介绍

用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符称为 “关系运算符”(relational operator),主要有下面 6 个:

运算符描述
>大于运算符,用于比较两个数值,如果左侧数值大于右侧数值,则返回 1 (真),否则返回 0 (假)
<小于运算符,用于比较两个数值,如果左侧数值小于右侧数值,则返回 1 (真),否则返回 0 (假)
>=大于等于运算符,用于比较两个数值,如果左侧数值大于或等于右侧数值,则返回 1 (真),否则返回 0 (假)
<=小于等于运算符,用于比较两个数值,如果左侧数值小于或等于右侧数值,则返回 1 (真),否则返回 0 (假)
==相等运算符,用于比较两个值是否相等,如果相等,则返回 1 (真),否则返回 0 (假)
!=

不等于运算符,用于比较两个值是否不相等,如果不相等,则返回 1 (真),否则返回 0 (假)

关系表达式通常返回 01,表示真假 (0 表示所有非零值表示)。比如,表达式 20 > 12 返回 1,12 > 20 返回 0。
关系表达式常用于 if 或 while 结构。

注意:相等运算符 == 与赋值运算符 = 是两个完全不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。

if (x = 3) {}

这里是赋值语句(把3赋值给x),不是判断x和3是否相等,x = 3 执行完成会返回 3 ,属于非零值,为真,所以始终会走到if条件去,执行if条件下的所有语句。(编译器是不会报错的)

建议:一个常量和一个变量比较相等的时候,建议将常量放在 == 的左边,因为即使写出 3 = x 编译器会报错(变量无法赋值给一个常量),只有写成 3 == x 才能正常执行。 

2、关系操作符的连用

多个关系运算符不宜连用。

举例:

i < j < k

上面示例中,连续使用了两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左往右计算的,所以实际执行的是下面的表达式:

( i < j ) < k

上面式子中,从左往右会先执行 i 和 j 的大小比较,i < j 返回 1,i > j 返回 0 ,所以最终是 1 或 0 与变量 k 进行比较。

想要达到保证变量 j 的值在 i 和 k 之间,需要写出下面这样:

i < j && j < k

3、浮点数比较相等

在比较浮点数时,由于浮点数在计算机中是以有限精度表示的,也就是说有些浮点数在内存中其实是无法精确保存的,这就可能导致浮点数比较中的一些精度误差问题。
如果直接使用 == 来比较两个浮点数,很可能会由于这些微小的误差导致不准确的结果。

我们拿实例说话:

大家是不是感觉很神奇?从数学角度考虑a + b 是否等于 c ,很显然是成立的,但是由于计算机无法精确存储 a ,b, c,这就会导致判断相等上出现问题。

那浮点数怎么比较呢?

答:要允许有误差存在

常见的写法如下:

二、条件操作符

1、条件操作符介绍

条件操作符也叫三目操作符,需要接收三个操作数的,形式如下:

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果 exp1 为真,exp2 计算,exp2 计算的结果就是整个表达式的结果;如果 exp1 为假,exp3 计算,exp3 计算的结果就是整个表达式的结果。
这种三目操作符和 if 语句的逻辑非常相似,就是根据 exp1 的结果来选择执行 exp2,或者 exp3。一般使用在简单的逻辑判断中。

举例:

在这道题目中,输入3个整数,要求输出最大的整数。首先用第一个条件操作符找出 b 和 c 中的较大值放到变量 max 中,再用第二个条件操作符找出 a 和 max 中的较大值再次赋值给 max ,最后输出 max 即可达到想要的效果。

三、逻辑操作符

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符:

符号名称功能
!逻辑取反运算符改变单个表达式的真假状态。如果表达式为真,则结果为假;如果表达式为假,则结果为真。
&&逻辑与运算符两侧的表达式都需要为真时,结果才为真。如果任何一个表达式为假,结果就为假。
||逻辑或运算符两侧的表达式中,只要有一个为真,结果就为真。只有当两个表达式都为假时,结果才为假。

1、逻辑取反运算符

a!a
非 00
01

举例:

在上述示例中 flag 初始化为 0 ,为假,但是 !flag 实现了取反,!flag 整体为真,执行i f 条件下的全部语句。

2、逻辑与运算符

aba&&b
非 0非 01
非 000
0非 00
000

&& 就是与运算符,是并且的意思,&& 是一个双目操作符,使用的方式是 a&&b,&& 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。

举例,判断春季:

3、逻辑或运算符

|| 是或运算符,也就是或者的意思,|| 是一个双目操作符,使用的方式是 a || b,|| 两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

举例,判断冬季:

4、短路

逻辑运算符有一个特点,它总是先对左侧的表达式求值再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式就能确定整个表达式的结果,就不再对右边的表达式求值,这种情况称为 “短路”。
如前面的代码:

if(month >= 3 && month <=5)

表达式中 && 的左操作数是 month >= 3,右操作数是 month <= 5,当左操作数 month>= 3 的结果是 0 的时候,即使不判断 month <= 5,整个表达式的结果也是 0(不是春季)。
所以,对于 && 操作符来说,左边操作数的结果是 0 的时候,右边操作数就不再执行
对于 || 操作符来说,以前面的代码为例:

if(month == 12 || month == 1 || month == 2)

如果 month == 12,则不用再判断 month 是否等于 1 或者 2,整个表达式的结果是 1(是冬季)。
所以,|| 操作符的左操作数的结果不为 0 时,就无需执行右操作数
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值


http://www.kler.cn/a/428798.html

相关文章:

  • Docker配置国内镜像源
  • QLineEdit 在文本发生变更时触发事件几种方式详细说明
  • ChromeOS 132 版本更新
  • 【Leetcode 热题 100】70. 爬楼梯
  • 《汽车维护与修理》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • 记录node-sass无法安装的问题
  • 第三部分:进阶概念 7.数组与对象 --[JavaScript 新手村:开启编程之旅的第一步]
  • 猜数字的趣味小游戏——rand函数、srand函数、time函数的使用
  • 深入探索汽车CMSF功能:工作原理与应用场景详解
  • 基于触觉感知的目标识别技术在智能机器人抓取中的应用综述
  • 项目实现:C++与SQL整合
  • burp(8)-ip伪造及爬虫审计
  • 计算机毕设-基于springboot的实践性教学系统设计与实现(附源码+lw+ppt+开题报告)
  • 证明网络中的流形成一个凸集
  • ETCD的封装和测试
  • 【Python】练习【24-12-8】
  • Mac M1 安装数据库
  • 关于项目二次开发那点事儿
  • 力扣打卡5:LRU缓存
  • Qt 面试题学习14_2024-12-6
  • Docker单机网络:解锁本地开发环境的无限潜能
  • Android 15 平台签名的共享 UID 许可名单
  • SQL面试题——京东SQL面试题 合并数据
  • 【Canvas与图标】乡土风金属铝边立方红黄底黑字图像处理图标
  • C#生成CSR(CertificateSigningRequest)和密钥
  • SQL高级应用——存储过程与触发器