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

C++ Primer阅读笔记--表达式和运算符的使用

1--左值和右值

        C++ 的表达式有右值(rvalue, are-value)和左值(lvalue, ell-value)两个形式;当一个对象被用作右值时,使用的是对象的值(内容);当对象被用作左值时,使用的是对象的身份(在内存中的位置);

        使用关键字 decltype 作用于左值和右值时,返回的类型不同:

        当表达式的求值结果是左值时,decltype 作用于该表达式(不是变量)将得到一个引用类型;

        当表达式的求值结果是右值时,decltype 作用于该表达式将得到与表达式相同的类型;

int *p;decltype(*p) // int &decltype(&p) // int **// *解引用返回的是左值,所以 decltype(*p) 返回的是引用类型
// &取地址符返回的是右值,所以 decltype(&p) 返回的类型与 &p 相同,
// 即指向 p 的指针,而 p 的类型是int *,所以最终返回的是int **,指向整型指针的指针

2--除法和取余

        C++11 新标准规定商一律向 0 取整(直接切除小数部分);

        除去 -m 导致溢出的特殊情况,(-m)/n 和 m/(-n) 都等于-(m/n)m%(-n)等于m%n(-m)%n等于-(m%n); 

21 % 6; // 2
21 % 7; // 0
-21 % -8; // -5 // -21%-8 == -(21%-8) == -(21%8) == -5
21 % -5; // 121 / 6; // 3
21 / 7; // 3
-21 / -8; // 2
21 / -5; // -4

3--递增和递减运算符

        递增和递减运算符有两种形式:前置版本和后置版本;

        前置版本首先将运算对象加1 (减1),然后将改变后的对象作为求值结果进行返回;后置版本同样将运算对象加1 (减1),但会将运算对象改变前的值的副本作为求值结果进行返回;

        递增和递减运算符都必须作用于左值运算对象,前置版本将对象作为左值进行返回,后置版本则将对象原始值的副本作为右值返回;

4--条件运算符

cond ? expr1, expr2;

        首先求 cond 的值,如果条件为真,对 expr1 求值并返回该值,否则对 expr2 求值并返回该值;

        当条件运算符的两个表达式都是左值或能转换成同一种左值类型时,运算结果是左值,否则运算的结果是右值;

        允许在条件运算符的内部嵌套另一个条件运算符,即条件表达式可以作为另一个条件运算符的 cond 或 expr;

cond1 ? exprA : (cond2) ? exprB : exprC;

5--位或运算符和逻辑运算符

位或运算符:逐位进行相应的逻辑操作

        &(位与)、|(位或)、^(位异或)、~(位求反);

逻辑运算符:

        &&(逻辑与)、||(逻辑或)、!(逻辑非);

6--sizeof运算符

        sizeof 运算符返回一条表达式或一个类型名字所占的字节数,其值是一个 size_t 类型的常量表达式;

        sizeof 运算符的结果部分地依赖于其作用的类型:

① 对 char 或类型为 char 的表达式执行 sizeof 运算,其结果为 1;

② 对引用类型执行 sizeof 运算得到被引用对象所占空间的大小;

③ 对指针执行 sizeof 运算得到指针本身所占的空间大小;

④ 对解引用指针执行 sizeof 运算得到指针指向的对象所占的空间大小,指针无需有效;

⑤ 对数组执行 sizeof 运算得到整个数组所占的空间大小,等价于对数组中所有的元素各执行一次 sizeof 运算并将所得结果求和;

⑥ 对 string 对象或 vector 对象执行 sizeof 运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间;

7--类型转换

        命名的强制类型转换:cast_name<type>(expression); 其中 type 是转换的目标类型,expression 是待转换的值,cast_name 是static_cast、dynamic_cast、const_cast 和 reinterpret_cast 中的一种;

        任何具有明确定义的类型转换,只要不包含底层 const (指针的指向可以改变,指针指向的值不能修改,类似于指向常量的指针),都可以使用 static_cast;当需要把一个较大的算术类型赋值给较小的类型时,static_cast 非常有用,即告诉编译器这个操作我们知道会损失精度但不在乎精度的损失,从而可以关闭警告信息;​​​​​​​

double A = static_cast<double>(B) / C;
// 对 B 进行强制类型转换以便执行浮点数除法;

        const_cast 只能改变运算对象的底层 const (指针的指向可以改变,指针指向的值不能修改,类似于指向常量的指针),对于将常量对象转换成非常量对象的行为,一般称其为 “去掉const性质”;

        一旦去掉某个对象的 const 性质,编译器就不会阻止对该对象进行写操作;​​​​​​​

#include "iostream"int main(int argc, char* argv[]){const int a = 30;const int *p = &a;int *q = const_cast<int*>(p);*q = 10;std::cout << "a: " << a << std::endl;std::cout << "*p: " << *p << std::endl;std::cout << "*q: " << *q << std::endl;std::cout << "&a: " << &a << std::endl;std::cout << "p: " << p << std::endl;std::cout << "q: " << q << std::endl;return 0;
}

        当使用 const 声明一个常量时,在 C++ 中会把这个常量写到 ROM(磁盘)中,并且这个 ROM 地址会映射到内存,指向的地址不变。

        当使用 const_cast 去掉 const 限定后,将地址赋给另外的变量指针;当改变变量指针的值时,实际上是改变了内存地址中存的数据,但并没有改变在外存(磁盘)中的数据。因此当读取变量指针的值时,其实是取内存中的数据,当使用原常量名时取的是外存中的数据;

相关文章:

C++ Primer阅读笔记--表达式和运算符的使用

1--左值和右值 C 的表达式有右值&#xff08;rvalue, are-value&#xff09;和左值&#xff08;lvalue, ell-value&#xff09;两个形式&#xff1b;当一个对象被用作右值时&#xff0c;使用的是对象的值&#xff08;内容&#xff09;&#xff1b;当对象被用作左值时&#xff0…...

npm install xxx的执行过程及示例

当你在终端中执行npm install xxx命令时&#xff0c;npm会执行以下步骤来安装软件包&#xff1a; 检查本地npm缓存中是否有该软件包。 如果本地npm缓存中已经存在该软件包&#xff0c;npm将直接从缓存中提取软件包并安装。这将显著加快安装速度&#xff0c;因为npm无需从网络下…...

excel数据分析比赛

基础 sql:百度网盘 请输入提取码 excel函数 <...

Git使用GitHub说明

GitHub为公网代码托管仓库&#xff0c;Git可以将本地仓库推送到GitHub管理。 步骤&#xff1a;1、注册GitHub账号 2、创建仓库&#xff08;会得到一个仓库地址&#xff09; 3、推送本地仓库 git remote add origin https://github.com/jianshengchuanqi/xuesezhanjiang.git…...

这些不可不知的JVM知识

JVM是面试中必问的部分&#xff0c;本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。 先上图&#xff1a; JVM必备知识 1、JVM基本概念 1.1、JVM是什么 JVM 的全称是 「Java Virtual Machine」&#xff0c;也就是我们耳熟能详的 Java 虚拟机。 JVM具备着计算机的…...

基于RK3568的Linux驱动开发——GPIO知识点(一)

authordaisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主系列基于RK3568的Linux驱动开发—— GPIO知识点&#xff08;二&#xff09;_daisy.skye的博客-CSDN博客 gpio bank RK3568 有 5 组 GPIO bank&#xff1a;GPIO0~GPIO4&#xff0c;每组又以 A0-A7、B0-B7、 C0-C7、 D0…...

5.2.1二叉树的定义和基本术语

二叉树的基本概念&#xff1a; 二叉树是递归定义的二叉树 下面我们来看几个特殊的二叉树&#xff1a; 特点&#xff1a; 1&#xff09;只有最后一层有叶子节点 2&#xff09;不存在度为1的结点 3&#xff09;按层序从1开始编号&#xff0c;结点i的左孩子为2i&#xff0c;右孩…...

动态组件、keep-alive的使用及自定义指令

目录 1. 动态组件 2.如何实现动态组件渲染 3. 使用keep-alive保持状态 4. keep-alive对应的生命周期函数 5. keep-alive的include属性 自定义指令 1.什么是自定义指令 2. 自定义指令的分类 3. 私有自定义指令 4. update函数 5. 函数简写 全局自定义指令&#xff1a; …...

基于JavaSpringMVC+Mybatis+Jquery高校毕业设计管理系统设计和实现

基于JavaSpringMVCMybatisJquery高校毕业设计管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…...

问题排查记录-ffmpeg链接libavfilter和libavcodec:未定义的引用

目录 一、问题背景 二、问题现象 2.1 ffmpeg测试例程 2.2 编译脚本 2.3 错误提示 三、问题排查 3.1 关于提示找不到“stdio" "iostream"头文件的问题 3.1.1查看工具链头文件检索位置 3.1.2 根据工具链路径查找头文件 3.1.3 在编译脚本中指定头文件路径…...

打印流,Properties类

打印流只有输出流&#xff0c;没有输入流 package com.hspedu.printstream;import java.io.IOException; import java.io.PrintStream;/*** author 韩顺平* version 1.0* 演示PrintStream &#xff08;字节打印流/输出流&#xff09;*/ public class PrintStream_ {public stat…...

TinyOS 配置教程

系列文章目录 TinyOS 系列文章【一】&#xff1a;TinyOS 配置教程 TinyOS 系列文章【二】&#xff1a;Tossim 教程 文章目录 系列文章目录前言1. 安装1.1. 实验环境1.2. TinyOS基础工作1.3. TinyOS 的配置1.4. 安装 java1.5. 安装编译器 2. 测试仿真程序总结 前言 本文主要用…...

【工作总结】后端开发人员的坏习惯

文章目录 前言一、不遵循项目规范二、用复杂SQL语句来解决问题三、缺少全局把控思维&#xff0c;只关注某一块业务四、函数复杂冗长,逻辑混乱五、缺乏主动思考&#xff0c;拿来主义六、核心业务逻辑,缺少相关日志和注释七、修改代码&#xff0c;缺少必要测试八、需求没理清&…...

review

review post提交方式下的设置编码&#xff0c;防止中文乱码 request.setCharaterEncoding(“utf-8”); get提交方式&#xff0c;tomcat8开始&#xff0c;编码不需要设置 tomcat8之前&#xff0c;get方式设置比较麻烦&#xff1a; String fname request.getParameter("f…...

【人工智能概论】 用Python实现数据的归一化

【人工智能概论】 用Python实现数据的归一化 文章目录 【人工智能概论】 用Python实现数据的归一化一. 数据归一化处理的意义二. 常见的归一化方法2.1 最大最小标准化&#xff08;Min-Max Normalization&#xff09;2.2 z-score 标准化 三. 用sklearn实现归一化 一. 数据归一化…...

【Python】matplotlib设置图片边缘距离和plt.lengend图例放在图像的外侧

一、问题提出 我有这样一串代码&#xff1a; import matplotlib.pyplot as plt plt.figure(figsize (10, 6)) " 此处省略代码 " legend.append("J") plt.legend(legend) plt.xlabel(recall) plt.ylabel(precision) plt.grid() plt.show()我们得到的图像…...

oracle 11g等保加固

有个单机环境需要做个等保加固 1、执行如下sql ?/rdbms/admin/utlpwdmg.sql --alter profile default limit password_verify_function null; Alter PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90; alter profile DEFAULT limit password_lock_time 30; alter profile DEFAU…...

【设计模式】设计模式之解释器模式

文章目录 前言一、解释器模式二、最佳实践总结 前言 本节给大家讲一下设计模式中的解释器模式,并结合实际业务场景给大家讲解如何使用~ 所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整~ 一、解释器模式 解释器模式&#xff08;Interpreter Pattern&#xff09;…...

leetcode551. 学生出勤记录 I

题目描述解题思路执行结果 leetcode551. 学生出勤记录 I . 题目描述 给你一个字符串 s 表示一个学生的出勤记录&#xff0c;其中的每个字符用来标记当天的出勤情况&#xff08;缺勤、迟到、到场&#xff09;。记录中只含下面三种字符&#xff1a; A&#xff1a;Absent&#xff…...

flume拦截器介绍

Flume是一个开源的、分布式的、可靠的、高效的海量数据采集、聚合和传输系统。其中&#xff0c;拦截器(Interceptor)是Flume中的一种组件&#xff0c;可以在数据(Event)流动的各个阶段对数据进行处理、过滤或转换&#xff0c;从而实现更为灵活、高效的数据采集和传输。 1、拦截…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...