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 的表达式有右值(rvalue, are-value)和左值(lvalue, ell-value)两个形式;当一个对象被用作右值时,使用的是对象的值(内容);当对象被用作左值时࿰…...
npm install xxx的执行过程及示例
当你在终端中执行npm install xxx命令时,npm会执行以下步骤来安装软件包: 检查本地npm缓存中是否有该软件包。 如果本地npm缓存中已经存在该软件包,npm将直接从缓存中提取软件包并安装。这将显著加快安装速度,因为npm无需从网络下…...
excel数据分析比赛
基础 sql:百度网盘 请输入提取码 excel函数 <...
Git使用GitHub说明
GitHub为公网代码托管仓库,Git可以将本地仓库推送到GitHub管理。 步骤:1、注册GitHub账号 2、创建仓库(会得到一个仓库地址) 3、推送本地仓库 git remote add origin https://github.com/jianshengchuanqi/xuesezhanjiang.git…...
这些不可不知的JVM知识
JVM是面试中必问的部分,本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。 先上图: JVM必备知识 1、JVM基本概念 1.1、JVM是什么 JVM 的全称是 「Java Virtual Machine」,也就是我们耳熟能详的 Java 虚拟机。 JVM具备着计算机的…...
基于RK3568的Linux驱动开发——GPIO知识点(一)
authordaisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主系列基于RK3568的Linux驱动开发—— GPIO知识点(二)_daisy.skye的博客-CSDN博客 gpio bank RK3568 有 5 组 GPIO bank:GPIO0~GPIO4,每组又以 A0-A7、B0-B7、 C0-C7、 D0…...
5.2.1二叉树的定义和基本术语
二叉树的基本概念: 二叉树是递归定义的二叉树 下面我们来看几个特殊的二叉树: 特点: 1)只有最后一层有叶子节点 2)不存在度为1的结点 3)按层序从1开始编号,结点i的左孩子为2i,右孩…...
动态组件、keep-alive的使用及自定义指令
目录 1. 动态组件 2.如何实现动态组件渲染 3. 使用keep-alive保持状态 4. keep-alive对应的生命周期函数 5. keep-alive的include属性 自定义指令 1.什么是自定义指令 2. 自定义指令的分类 3. 私有自定义指令 4. update函数 5. 函数简写 全局自定义指令: …...
基于JavaSpringMVC+Mybatis+Jquery高校毕业设计管理系统设计和实现
基于JavaSpringMVCMybatisJquery高校毕业设计管理系统设计和实现 博主介绍:5年java开发经验,专注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类
打印流只有输出流,没有输入流 package com.hspedu.printstream;import java.io.IOException; import java.io.PrintStream;/*** author 韩顺平* version 1.0* 演示PrintStream (字节打印流/输出流)*/ public class PrintStream_ {public stat…...
TinyOS 配置教程
系列文章目录 TinyOS 系列文章【一】:TinyOS 配置教程 TinyOS 系列文章【二】:Tossim 教程 文章目录 系列文章目录前言1. 安装1.1. 实验环境1.2. TinyOS基础工作1.3. TinyOS 的配置1.4. 安装 java1.5. 安装编译器 2. 测试仿真程序总结 前言 本文主要用…...
【工作总结】后端开发人员的坏习惯
文章目录 前言一、不遵循项目规范二、用复杂SQL语句来解决问题三、缺少全局把控思维,只关注某一块业务四、函数复杂冗长,逻辑混乱五、缺乏主动思考,拿来主义六、核心业务逻辑,缺少相关日志和注释七、修改代码,缺少必要测试八、需求没理清&…...
review
review post提交方式下的设置编码,防止中文乱码 request.setCharaterEncoding(“utf-8”); get提交方式,tomcat8开始,编码不需要设置 tomcat8之前,get方式设置比较麻烦: String fname request.getParameter("f…...
【人工智能概论】 用Python实现数据的归一化
【人工智能概论】 用Python实现数据的归一化 文章目录 【人工智能概论】 用Python实现数据的归一化一. 数据归一化处理的意义二. 常见的归一化方法2.1 最大最小标准化(Min-Max Normalization)2.2 z-score 标准化 三. 用sklearn实现归一化 一. 数据归一化…...
【Python】matplotlib设置图片边缘距离和plt.lengend图例放在图像的外侧
一、问题提出 我有这样一串代码: 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语言为主, 好了, 废话不多说直接开整~ 一、解释器模式 解释器模式(Interpreter Pattern)…...
leetcode551. 学生出勤记录 I
题目描述解题思路执行结果 leetcode551. 学生出勤记录 I . 题目描述 给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符: A:Absentÿ…...
flume拦截器介绍
Flume是一个开源的、分布式的、可靠的、高效的海量数据采集、聚合和传输系统。其中,拦截器(Interceptor)是Flume中的一种组件,可以在数据(Event)流动的各个阶段对数据进行处理、过滤或转换,从而实现更为灵活、高效的数据采集和传输。 1、拦截…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...
