【C++】关系操作符的全面解析与高级应用


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯关系操作符
    • 1.关系操作符的分类与语义
    • 2.关系操作符的连用问题
    • 3.浮点数比较的精度问题
      • 问题示例
      • 解决方案
  • 💯总结
    • 核心要点
  • 💯小结


在这里插入图片描述


💯前言

  • 在学习 C++ 的过程中,关系操作符作为编程逻辑的核心构成部分,起着至关重要的作用。本篇文章旨在全面梳理关系操作符的基本概念高级用法,同时探讨常见误用情境及其解决方案。通过深刻理解这些操作符的特性,我们可以更高效地设计逻辑优化代码性能,并减少潜在错误
    C++ 参考手册
    在这里插入图片描述

💯关系操作符

关系操作符是一类二元操作符,用于比较两个表达式或值,其输出为布尔值,即 1(真)或 0(假)。掌握关系操作符的使用是实现高效条件判断的基础。


1.关系操作符的分类与语义

在这里插入图片描述
C++ 提供六种关系操作符,它们主要用于数值的比较。以下是这些操作符的功能分类:

运算符描述
>大于运算符,用于判断左操作数是否大于右操作数,返回布尔值。
<小于运算符,用于判断左操作数是否小于右操作数,返回布尔值。
>=大于等于运算符,用于判断左操作数是否大于等于右操作数,返回布尔值。
<=小于等于运算符,用于判断左操作数是否小于等于右操作数,返回布尔值。
==等于运算符,用于判断两个操作数是否相等,返回布尔值。
!=不等于运算符,用于判断两个操作数是否不相等,返回布尔值。

代码示例:

#include <iostream>
using namespace std;
int main()
{
	int a = 5, b = 10;
	
	cout << (a > b) << endl;  // 输出 0,表示 5 不大于 10
	cout << (a < b) << endl;  // 输出 1,表示 5 小于 10
	cout << (a == b) << endl; // 输出 0,表示 5 不等于 10
	cout << (a != b) << endl; // 输出 1,表示 5 不等于 10
    return 0;
}

在这里插入图片描述

上述例子展示了关系操作符的基本功能与语义。它们通常被广泛应用于条件语句(如 ifwhile),以实现程序的逻辑控制。


2.关系操作符的连用问题

在这里插入图片描述
在 C++ 编程实践中,多个关系操作符的连用可能导致不符合预期的逻辑结果,尽管从语法上看这些表达式是合法的。

问题示例:

#include <iostream>
using namespace std;
int main()
{
	int i = 5, j = 10, k = 15;
	if (i < j < k) {
	    cout << "i < j < k" << endl;
	}
    return 0;
}

在这里插入图片描述

问题分析:

  • 表达式 i < j < k 被解析为 (i < j) < k
    • 首先计算 i < j,其结果为布尔值(01)。
    • 然后将该布尔值与 k 进行比较。
  • 例如,当 i = 5, j = 10, k = 15 时,i < j 的结果为 1,然后计算 1 < 15,其结果为 1,显然与我们期望的逻辑不符。

解决方案:
如果需要表达 i < j 且 j < k 的语义,应采用逻辑与操作符 &&

#include <iostream>
using namespace std;
int main()
{
	int i = 5, j = 10, k = 15;
	if (i < j && j < k) {
	    cout << "i < j && j < k" << endl;
	}
    return 0;
}

在这里插入图片描述

这种写法清晰地表达了两个条件必须同时成立的逻辑,避免了因操作符优先级导致的语义偏差。


3.浮点数比较的精度问题

在这里插入图片描述
由于浮点数在计算机内部是以有限精度表示的,直接使用 == 比较浮点数可能会因为精度误差导致不符合直觉的结果。


问题示例

#include <iostream>
using namespace std;

int main() {
    double a = 0.1;
    double b = 0.2;
    double c = 0.3;

    if (a + b == c)
        cout << "a + b == c" << endl;
    else
        cout << "a + b != c" << endl;

    return 0;
}

在这里插入图片描述

运行结果:

a + b != c

问题分析:

  • 在二进制浮点表示中,a + b 的结果可能不是精确的 0.3,而是类似于 0.30000000000000004
  • 因此,a + b == c 的比较返回 false

解决方案

对于浮点数比较,应采用容差范围的方式来判断数值的近似相等。

代码示例:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a = 0.1;
    double b = 0.2;
    double c = 0.3;

    if (fabs((a + b) - c) < 1e-9) // 容差范围为 1e-9
        cout << "a + b 约等于 c" << endl;
    else
        cout << "a + b 不等于 c" << endl;

    return 0;
}

在这里插入图片描述

输出结果:

a + b 约等于 c

解决思路:

  • 使用 fabs 计算浮点数差值的绝对值。
  • 将该绝对值与预定义的容差进行比较。
  • 当绝对值小于容差时,认为两个数值近似相等。

这种方法在科学计算和金融分析中尤为重要,因为它能够有效避免浮点数精度误差导致的逻辑问题。


💯总结

在这里插入图片描述
通过对关系操作符的研究,我们可以更精确地控制程序的逻辑流,并减少由误用导致的潜在漏洞。以下是关键知识点的回顾:


核心要点

在这里插入图片描述

  1. 关系操作符的基础理解:

    • 熟练掌握六种关系操作符的功能和适用场景。
    • 理解布尔值的语义及其在条件控制中的作用。
  2. 操作符连用的注意事项:

    • 避免直接连用多个关系操作符。
    • 使用逻辑与(&&)和逻辑或(||)明确表达复杂条件。
  3. 浮点数比较的最佳实践:

    • 了解浮点数精度问题的来源。
    • 使用容差方法比较浮点数,确保逻辑的准确性。

💯小结

  • 在这里插入图片描述
    本次学习不仅让我们深入理解了 C++ 关系操作符 的使用细节,还提醒我们在编程时需高度关注底层实现可能带来的影响。在未来的实践中,可以将这些经验应用于更复杂的程序设计,不断提高代码的健壮性可维护性。通过这些深入探讨,程序开发者不仅能够准确使用关系操作符,还可以更熟练地应对编程中可能遇到的潜在问题,为代码质量保驾护航

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/933849.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫--某房源网站验证码破解

文章目录 使用模块爬取目标验证码技术细节实现成果代码实现使用模块 requests请求模块 lxml数据解析模块 ddddocr光学识别 爬取目标 网站验证码破解思路是统一的,本文以城市列表为例 目标获取城市名以及城市连接,之后获取城市房源信息技术直接替换地址即可 验证码 技术…

java+ssm+mysql校园物品租赁网

项目介绍&#xff1a; 使用javassmmysql开发的校园物品租赁网&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;物品管理&#xff08;物品种类、物品信息、评论信息&#xff09;&#xff1b;订单管理&#xff1…

【JS】简单CSS简单JS写的上传进度条

纯JS写的&#xff0c;简单的上传进度条&#xff0c;当上传的文件较大&#xff0c;加一个动态画面&#xff0c;就不会让人觉得出错了或网络卡了 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"v…

Oracle系统性能监控工具oswatcher演示

1、关于 OSW OSWatcher 的使用符合 Oracle 的标准许可条款&#xff0c;并且不需要额外的许可即可使用&#xff01;&#xff01;&#xff01;&#xff01; OSWatcher (oswbb) 是一种 UNIX shell 脚本的集合&#xff0c;主要用于收集和归档操作系统和网络的度量&#xff0c;以便…

Oracle EBS PAC 如何复修非标任务单生产生非常大的PAC成本?

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状 非标准任务单组件和装配相同物料A,俗称投入A产A。该物料A的期初数量为0。 上期成本假设为20,而本期成本爆增至563.674234。关键问题点: 由于该物料没有期初数量,无法通过“更新定期成本”指定“新期本…

word实践:正文/标题/表图等的共用模板样式设置

说在前面 最近使用word新建文件很多&#xff0c;发现要给大毛病&#xff0c;每次新建一个word文件&#xff0c;标题/正文的字体、大小和间距都要重新设置一遍&#xff0c;而且每次设置这些样式都忘记了参数&#xff0c;今天记录一下&#xff0c;以便后续方便查看使用。现在就以…

java抽奖系统(一)2.0

1. 项⽬介绍 1.1 背景 随着数字营销的兴起&#xff0c;企业越来越重视通过在线活动来吸引和留住客⼾。抽奖活动作为⼀种有效的营 销⼿段&#xff0c;能够显著提升⽤⼾参与度和品牌曝光率。于是我们就开发了以抽奖活动作为背景的Spring Boot项⽬&#xff0c;通过这个项⽬提供⼀…

spring 源码分析

1 IOC 源码解析 BeanDefinition: bean的定义。里面会有beanClass、beanName、scope等属性 beanClass&#xff1a;通过Class.forName生成的Class 对象beanName&#xff1a;context.getBean(“account”)&#xff0c;acount就是beanNamescope: 作用区分单例bean、原型bean Bea…

Android水波纹效果

Android水波纹效果 需要到水波纹效果的场景还蛮少的。万一刚好你需要呢 一、思路&#xff1a; 自定义组件SpreadView 二、效果图&#xff1a; 看视频更直观点&#xff1a; Android轮子分享-水波纹效果 三、关键代码&#xff1a; public class SpreadView extends View {pr…

用 NotePad++ 运行 Java 程序

安装包 网盘链接 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装完成: 配置编码 用 NotePad 写 Java 程序时, 需要设置编码. 在 设置, 首选项, 新建 中进行设置, 可以对每一个新建的文件起作用. 之前写的文件不起作用. 在文件名处右键, 可以快速打开 CMD 窗口, 且路…

TaskBuilder SQL执行工具

为了方便开发者连接当前任擎服务器上配置的各个数据源对应的数据库进行相关操作&#xff0c;TaskBuilder提供了一个SQL执行工具&#xff0c;点击系统侧边栏里的执行SQL图标 &#xff0c;即可打开该工具&#xff0c;界面如下图所示&#xff1a; 该工具从上至下分为三个区域&a…

学生信息管理系统(简化版)数据库部分

使用Mysql&#xff0c;与navicat工具 下面是mysql创建的代码&#xff0c;可做必要修改 -- 创建学生学籍信息表 CREATE TABLE StudentEnrollment (-- 学号&#xff0c;作为主键student_id VARCHAR(8) NOT NULL,-- 学生姓名stu_name VARCHAR(8) NOT NULL,-- 学生性别gender VARC…

计算机网络之传输层协议TCP

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之传输层协议TCP 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

美畅物联丨观看实时视频对服务器带宽有什么要求?

​随着互联网的迅猛发展&#xff0c;实时视频观看已然成为人们日常生活中不可或缺的一部分。不管是视频会议、在线教育&#xff0c;还是在线娱乐&#xff0c;实时视频都起到了极为重要的作用。不过&#xff0c;实时视频的流畅播放对服务器的带宽有着极高的要求。本文将深入探究…

SWIRL:有望成为2025年顶级AI搜索引擎

现在几乎每家公司都会有内部文档系统&#xff0c;如阿里的语雀、钉钉&#xff0c;字节的飞书&#xff0c;Confluence&#xff0c;印象笔记等等都可以提供给B端在局域网部署。因此&#xff0c;如果能把搜索功能做得高效&#xff0c;就能提高自家产品的竞争力。 想象一下&#xf…

技术栈6:Docker入门 Linux入门指令

目录 1.Linux系统目录结构 2.处理目录的常用命令 3.Docker概述 4.Docker历史 5.Docker基本组成 6.Docker底层原理 7.Docker修改镜像源 8.Docker基本命令 9.Docker创建Nginx实战 10.数据卷 11.本地目录直接挂载* 12.镜像和dockerfile 13.容器互联与自定义网络 14.…

LeetCode - #156 上下翻转二叉树(会员题)

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 本题为 LeetCode 的高级会员解锁题 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读…

汽车零部件设计之——麦弗逊悬架KC特性分析仿真APP介绍

汽车零部件是汽车工业的基石&#xff0c;是构成车辆的基础元素。一辆汽车通常由上万件零部件组成&#xff0c;包括发动机系统、传动系统、制动系统、电子控制系统等&#xff0c;它们共同确保了汽车的安全、可靠性及高效运行。在汽车产业快速发展的今天&#xff0c;汽车零部件需…

STM32串口接收与发送(关于为什么接收不需要中断而发生需要以及HAL_UART_Transmit和HAL_UART_Transmit_IT的区别)

一、HAL_UART_Transmit和HAL_UART_Transmit_IT的区别 1. HAL_UART_Transmit_IT&#xff08;非阻塞模式&#xff09;&#xff1a; HAL_UART_Transmit_IT 是非阻塞的传输函数&#xff0c;也就是说&#xff0c;当你调用 HAL_UART_Transmit_IT 时&#xff0c;它不会等到数据完全发…

学生信息管理系统(简化版)后端接口

目录 allAPI __init__.py是空文件&#xff0c;目的让python知道这个文件夹是个包 ClassInfo.py from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from API.database import get_db, Base from sqlalchemy import Column, String,…