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、拦截…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...