《C++ Primer》第4章 表达式(二)

news2024/11/28 19:23:15

参考资料:

  • 《C++ Primer》第5版
  • 《C++ Primer 习题集》第5版

4.6 成员访问运算符(P133)

点运算符和箭头运算符都可用于访问成员,ptr->mem 等价于 (*ptr).mem 。箭头作用于指针类型对象,结果为左值;点运算符作用域对象,如果对象为左值则结果为左值,否则为右值。

4.7 条件运算符(P134)

条件运算符的形式如下:

cond ? expr1 : expr2;

其中,当 cond 为条件判断的表达式, expr1expr2 是两个类型相同或可转换为某个公共类型的表达式。条件运算符首先对 cond 求值,若结果为真,则对 expr1 求值并返回该值;反之,则对 expr2 求值并返回该值。当两个表达式都是左值或能转换成同一种左值类型时,运算的结果为左值,否则为右值。

嵌套条件运算符

string finalgrade = (graph > 90) ? "high pass"
    							 : (grade < 60) ? "fail" : "pass";

条件运算符满足右结合律

在输出表达式中使用条件运算符

条件运算符的优先级非常低,所以通常要在其两端加上括号。

4.8 位运算符(P135)

image-20230928154102763

位运算符如何处理符号位依赖于机器,所以强烈建议将位运算符用于无符号类型

移位运算符

移位运算符的右侧对象不能为负,且值必须严格小于结果的位数,否则将产生未定义行为。

需要注意的是,有符号类型在右移时插入符号位还是 0 由具体环境决定。

位求反运算符

位与、位或、位异或运算符

移位运算符满足左结合律

使用 coutcin 进行 IO 操作时会用到重载的移位运算符,重载运算符的优先级和结合律不变。移位运算符的优先级比算术运算符低,比关系运算符、赋值运算符和条件运算符高。

4.9 sizeof运算符(P139)

sizeof 运算符满足右结合律,结果为 size_t 类型的常量表达式:

sizeof(type);
sizeof expr;

sizeof 可以返回表达式结果类型的大小,但不实际计算运算对象的值:

sizeof(*p);
sizeof Sales_data::revenue;

正是由于上述特性,即使 p 是一个无效指针,此处的解引用操作也不会有负面影响。C++11 新标准还允许通过作用域运算符来获取类成员的大小。

sizeof 运算符需要注意的情形:

  • sizeof 运算符作用于数组时,不会把数组转换成指针,而是返回整个数组所占空间的大小,等价于对数组中所有元素各执行一次 sizeof 并求和。
  • sizeof 作用于 vectorstring 对象时将将返回一个固定的值,这个值与对象所含的元素个数无关。

获取数组元素个数的常见写法:

sizeof(arr)/sizeof(*arr);

4.10 逗号运算符(P140)

逗号运算符含两个运算对象,从左向右依次求值。逗号运算符首先对左侧运算对象求值,然后将求值结果丢弃,再对右侧运算对象求值并将该值作为结果(如果右侧运算对象的结果为左值,那么逗号运算符的结果也为左值)。

4.11 类型转换(P141)

int ival = 3.14 + 3;

上述表达式发生了隐式转换。算术类型之间的隐式转换被设计得尽可能避免损失精度,所以整型一般会转换成浮点型。因此,上面的表达式中的 3 首先被转换成 double 型,然后再将浮点数加法的结果转换成 int 型。

何时发生隐式类型转换

  • 在大多数表达式中,比 int 小的整型值会提升为较大的整数类型。
  • 条件中,非布尔值转换成布尔值

4.11.1 算术转换(P142)

算术转换的规则:运算对象转换成最宽的类型、整型转换成相应的浮点型。

整型提升

boolcharshort 等小整型,只要它们所有可能的值能存储在 int 里,就会被提升成 int ,否则被提升成 unsigned int

较大的 char 类型 (如 wchar_t )会被提升成最小能容纳其所有值的整型(至少为 int )。

无符号类型的运算对象

表达式首先执行整型提升,若提升后的运算对象均为带符号或均为无符号,则将小类型转换为大类型即可。

如果一个运算对象是无符号类型,一个对象是有符号类型,且那个无符号类型不小于有符号类型,则将带符号对象转换成无符号对象(如 intunsigned int 运算,要将 int 转换成 unsigned int );如果带符号类型大于无符号类型,此时如果带符号类型能容纳无符号类型的所有值,则将无符号对象转换成有符号对象,否则将有符号对象转换成无符号类型(如 longunsigned int ,转换的结果取决于 unsigned int 所占空间的大小)。

理解算术转换

3.14L + 'a';	// 'a'先被提升成int,再转换成long double

4.11.2 其他隐式类型转换(P143)

数组转换成指针:在大多数情况中,数组会自动转换成指向数组首元素的指针。当数组作为 decltype 关键字的参数,或 &sizeoftypeid 等运算符的对象时,上述转换不会发生。

指针的转换:常量整数值 0 和字面量 nullptr 能转换成任意类型的指针;任意指向非常量的指针能转换成 void* ;任意指向对象的指针能转换成 const void*

转换成布尔类型:如果指针类型或算术类型的值为 0 ,则结果为 false ,否则为 true

转换成常量

类类型定义的转换:类类型能定义由编译器自动执行的转换。

4.11.3 显式转换(P144)

命名的强制类型转换

cast-name<type>(expression);

其中,type 是转换的目标类型expression 是要转换的值,如果 type 是引用类型,则转换结果为左值。cast-namestatic_castdynamic_caseconst_castreinterpret_cast 中的一种

static_cast

任何具有明确定义,且不包含底层 const 的转换都可以使用 static_cast

int i = 1, j = 1;
double dval = static_cast<double>(j) / i;

当我们需要将大类型赋值给小类型不计较精度损失时,使用 static_cast 可以避免编译器输出警告信息。

static_cast 常用于找回 void* 中的值:

double d = 3.14;
void *p = &d;
double *dp = static_cast<double*>(p);

const_cast

const_cast 只能改变对象的底层 const

const char *pc = nullptr;
char *p = const_cast<char*>(pc);    // 正确
int *p = const_cast<int*>(pc);    // 错误

如果对象本身不是一个常量,使用 const_cast 获得写权限是合法的,否则将产生未定义行为:

int i = 1;
const int ci = 1;
const int *p1 = &i, *p2 = &ci;
int *q1 = const_cast<int*>(p1);    // 合法
int *q2 = const_cast<int*>(p2);    // 利用q2对ci进行写操作将会产生未定义行为

reinterpret_cast

reinterpret_cast 可以从位存储的角度对对象进行重新解释:

int *ip = nullptr;
char *pc = reinterpret_cast<char*>(ip);

应该尽可能避免使用强制类型转换

旧式的强制类型转换

早期的 C++ 版本中,显示强制类型转换包括以下两种类型:

type(expr);
(type)expr;

旧式的强制类型转换具有与 static_castconst_castreinterpret_cast 相似的行为。

4.12 运算符优先级表(P147)

image-20231007204724573 image-20231007204813931

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mysql】 blob 转text

有个数据表字段存储的字段类型是blob&#xff0c;想查看字段内容。 blob是二进制的无法直接查看怎么办&#xff1f; 写sql&#xff0c;blob 转text SELECT CONVERT(content USING utf8) FROM article_content ; 我想把原来content字段完全转成text 新建 text 类型字段conten…

uniapp 在uni.scss 根据@mixin定义方法 、通过@include全局使用

在官方文档中提及到uni.scss中变量的使用&#xff0c;而我想定义方法&#xff0c;这样写css样式更方便 一、官方文档的介绍 根据官方文档我知道&#xff0c;在这面定义的变量全局都可使用。接下来我要在这里定义方法。 二、在uni.scss文件中定义方法 我在uni.scss文件中定义了…

三、浏览器缓存动如何使用(Expires、 cache-control、Etag、last-modified)----哪些文件需要强缓存,哪些文件需要协商缓存

参考链接1&#xff1a;彻底弄懂强缓存与协商缓存 参考链接2&#xff1a;浏览器缓存 参考链接3&#xff1a;扼杀 304&#xff0c;Cache-Control: immutable 如何搭建 express&#xff0c;或者node服务 ### 如何搭建 express&#xff0c;npm install express --save### expre…

[C++基础]-多态

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 本期学习目标&am…

智能AI系统源码ChatGPT系统源码+详细搭建部署教程+AI绘画系统+已支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Chat…

NFT Insider#110:The Sandbox与TB Media Global合作,YGG Web3游戏峰会阵容揭晓

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#xff0…

双字单字拆分/合并操作(博途SCL源代码)

博途PLC的位、字节拆分和合并操作还可以参考下面的文章链接: 博途PLC 位/字/字节 Bit/ Word/Byte拆分与合并_博途的bit-CSDN博客有时候我们需要将分散分布的开关量信号组合为一个整体比如一个字节再完成发送,或者一些报警联锁控制,组合为一个字方便触摸屏报警记录等,下面我…

day11_oop_面向对象基础

零、今日内容 一、作业 二、面向对象 一、作业 题目26 设计方法,在一个数组中&#xff0c;返回所有的 指定数据的下标 例如, 这个数组[1,2,8,4,5,7,8,7,8,9],找到其中元素8的下标[2,6,8]public static void main(String[] args) {int[] arr {1,2,8,4,5,7,8,7,8,9};int[] ind…

云计算安全的新挑战:零信任架构的应用

文章目录 云计算的安全挑战什么是零信任架构&#xff1f;零信任架构的应用1. 多因素身份验证&#xff08;MFA&#xff09;2. 访问控制和策略3. 安全信息和事件管理&#xff08;SIEM&#xff09;4. 安全的应用程序开发 零信任架构的未来 &#x1f389;欢迎来到云计算技术应用专栏…

vue-3

一、文章内容概括 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 二、Vue生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09…

二叉搜索树的初步认识

二叉搜索树与常见的查找算法有什么区别&#xff1f; 首先&#xff0c;如果有同学不知道有哪些查找算法可以查看&#xff1a;常见查找算法_加瓦不加班的博客-CSDN博客 如果还有一些不了解的&#xff0c;请查看加瓦不加班_数据结构,链表,递归-CSDN博客 接下来&#xff0c;我们来…

玄子Share- IDEA 2023 SpringBoot 热部署

玄子Share- IDEA 2023 SpringBoot 热部署 修改 IDEA 部署设置 IDEA 勾选如下选项 新建 SpringBoot 项目 项目构建慢的将 Spring Initializr 服务器 URL 改为阿里云&#xff1a;https://start.aliyun.com/ 在这里直接勾选Spring Boot Devtools插件即可 测试 切出 IDEA 项目文…

「专题速递」AR协作、智能NPC、数字人的应用与未来

元宇宙是一个融合了虚拟现实、增强现实、人工智能和云计算等技术的综合概念。它旨在创造一个高度沉浸式的虚拟环境&#xff0c;允许用户在其中交互、创造和共享内容。在元宇宙中&#xff0c;人们可以建立虚拟身份、参与虚拟社交&#xff0c;并享受无限的虚拟体验。 作为互联网大…

2023年H1汽车社媒营销趋势报告

2023上半年车市“内卷”&#xff0c;汽车营销玩法越来越多样&#xff0c;品牌的矩阵式营销也成为头部车企重点营销战略。 据乘联会预测&#xff0c;2023下半年车市将受到二季度价格战的透支&#xff0c;需要一定修复期。在整体形势较不利的情况下&#xff0c;车企如何破局实现销…

通过IP地址如何计算相关地址

以IP地址为1921681005 子网掩码是2552552550为例。算出网络地址、广播地址、地址范围、主机数。 分步骤计算 1&#xff09; 将IP地址和子网掩码换算为二进制&#xff0c;子网掩码连续全1的是网络地址&#xff0c;后面的是主机地址。 虚线前为网络地址&#xff0c;虚线后为主机…

基于Java的个性化旅游攻略系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

yolov7的bug,无法指定显卡(程序默认0号卡)

**问题&#xff1a;**命令行参数指定的是4号卡&#xff0c;但实际却总是在0号卡建立进程 真抽象啊&#xff0c;这一步&#xff0c;模型被送到0号卡&#xff0c;但实际上&#xff0c;送到了4号卡&#xff08;进程是在4号卡上建立的&#xff09; 解决办法&#xff1a; 在train.py…

【LeetCode热题100】--230.二叉搜索树中第K小的元素

230.二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 二叉搜索树的中序遍历是有序的&#xff0c;所有先得到其有序序列&#xff0c;然后在取…

端口没有占用,Springboot却提示端口占用了

1.问题描述 *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 19004 was already in use.Action:Identify and stop the process thats listening on port 19004 or configure this applica…

【设计模式】使用原型模式完成业务中“各种O”的转换

文章目录 1.原型模式概述2.浅拷贝与深拷贝2.1.浅拷贝的实现方式2.2.深拷贝的实现方式 3.结语 1.原型模式概述 原型模式是一种非常简单易懂的模型&#xff0c;在书上的定义是这样的&#xff1a; Specify the kinds of objects to create using a prototypical instance,and cre…