第四章 表达式

一、基础

  • 重载运算符:当运算符作用在类类型的运算对象时,用户可以自行定义其含义。
  • 左值和右值
    • C中:左值可以在表达式左边,右值不能。
    • C++中:当一个对象被用作右值的时候,用的是对象的值(内容)。被用做左值时,用的是对象的身份(在内存中的位置)。

二、算术运算符

  • 溢出:当计算的结果超出该类型所能表示的范围时就会产生溢出。

三、逻辑和关系运算符

  • 短路求值:逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值

四、赋值运算符

  • 如果赋值运算的左右侧运算对象类型不同,则右侧运算对象将转换成左侧运算对象的类型。
  • 赋值运算符满足右结合律,这点和其他二元运算符不一样。 val = val1 = 0;等价于val = (val1 = 0);
  • 赋值运算优先级比较低。

五、成员访问运算符

六、条件运算符

  • 条件运算符(?:):允许把简单的if-else逻辑嵌入到单个表达式中去,按照如下形式:cond? expr1: expr2

七、位运算符

  • 位运算符是作用于整数类型的运算对象。
  • 二进制位向左移(<<)或者向右移(>>),移出边界外的位就被舍弃掉了。
  • 位取反(~)、与(&)、或(|)、异或(^)

八、sizeof运算符

  • 返回一条表达式或一个类型名字所占的字节数。返回的类型是 size_t。
  • 两种形式: sizeof (type)和 sizeof expr。
  • sizeof运算符的结果部分地依赖于其作用的类型:
    • 对char或者类型为char的表达式执行sizeof运算,结果为1。
    • 对引用类型执行sizeof运算得到被引用对象所占空间的大小。
    • 对指针执行sizeof运算得到指针本身所占空间的大小。
    • 对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针不需要有效。
    • 数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将结果求和。注意:sizeof运算不会把数组转换为指针来处理。
    • string或者vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。

九、逗号运算符

十、类型转换

1. 隐式类型转换

  • 比 int类型小的整数值先提升为较大的整数类型。
  • 条件判断中,非布尔转换成布尔。
  • 初始化中,初始值转换成变量的类型。
  • 算术运算或者关系运算的运算对象有多种类型,要转换成同一种类型。
  • 函数调用时。
  • 数组转换成指针

2. 显式类型转换

2.1. 命名的强制类型转换,格式为:cast-name(expression)

。其中,type:转换的类型;expression:需要转换的值;cast-name:static_cast、dynamic_cast、const_cast和reinterpret_cast。

2.2. static_cast:任何具有明确定义的类型转换,只要不包含底层const,都可以使用它。

// 进行强制类型转换以便执行浮点数除法
double slope = static_cast<double>(j) / i; void *p = &d; // 任何非常量对象的地址都能存入void *
// 将void * 转换回初始的指针类型
double *dp = static_cast<double*>(p);

2.3. dynamic_cast:支持运行时类型识别。

2.4. const_cast:只能改变运算对象的底层const。一般可用于去除const性质。

const char *pc;
char *p = const_cast<char*>(pc)

2.5. reinterpret_cast:通常为运算对象的位模式提供低层次上的重新解释。它本质上依赖于机器,要想安全的使用它必须对涉及的类型和编译器实现转换的过程非常了解。

2.6. 应该避免强制类型转换。

十一、运算符优先级表

【C++】《C++ Primer 》第四章的更多相关文章

  1. <<C++ Primer>> 第四章 表达式

    术语表 第 4 章 表达式 算术转换(arithmetic conversion): 从一种算术类型转换成另一种算术类型.在二元运算符的上下文中,为了保留精度,算术转换通常把较小的类型转换成较大的类型 ...

  2. C++Primer 第四章

    //1.当我们对运算符进行重载的时候,其包括运算对象的类型和返回值的类型都是由该运算符定义的,但是运算对象的个数和优先级,结合律都是不能改变的 //2.当一个对象被用作右值的时候,用的是对象的值(内容 ...

  3. c++primer 第四章编程练习答案

    4.13.1 #include<iostream> struct students { ]; ]; char grade; int age; }; int main() { using n ...

  4. C Primer Plus_第四章_字符串和格式化输入输出_编程练习

    Practice 1.输入名字和姓氏,以"名字,姓氏"的格式输出打印. #include int main(void) { char name[20]; char family[2 ...

  5. 《C++Primer》第五版习题解答--第四章【学习笔记】

    [C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...

  6. C++ Primer Plus学习:第十四章

    第十四章 C++中的代码重用 包含对象成员的类 将类的对象作为新类的成员.称为has-a关系.使用公有继承的时候,类可以继承接口,可能还有实现(纯虚函数不提供实现,只提供接口).使用包含时,可以获得实 ...

  7. C++ Primer Plus学习:第四章

    C++入门第四章:复合类型 1 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 使用数组前,首先要声明.声明包括三个方面: 存储每个元素中值的类型 数组名 数组中的元素个数 声明的通 ...

  8. 【C++】《C++ Primer 》第十四章

    第十四章 重载运算与类型转换 一.基本概念 重载运算符是具有特殊名字的函数:由关键字operator和其后要定义的运算符号共同组成.也包含返回类型.参数列表以及函数体. 当一个重载的运算符是成员函数时 ...

  9. C++ Primer Plus 第四章 复合类型 学习笔记

    第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...

随机推荐

  1. AcWing 1194. 岛和桥

    \(f[s][i][j]\) 表示一条有向路径(不经过重复点),当前路径点集合为 \(s\),最后两个点是 \(j\) → \(i\) 的最大价值 \(g[s][i][j]\) 类似,不过是方案数. ...

  2. 【NOI2018】你的名字(SAM & 线段树合并)

    Description Hint Solution 不妨先讨论一下无区间限制的做法. 首先"子串"可以理解为"前缀的后缀",因此我们定义一个 \(\lim(i) ...

  3. (原创)nginx反向代理上网,使docker可以拉取镜像

    转载请注明出处:饭饭博客:https://www.cnblogs.com/zzf0305/p/9602107.html 摘语:参考了N多大侠的资料,终于将自己的环境配置起来了.站在众多巨人的肩膀进行总 ...

  4. IDEA注册码(附修改hosts文件的方法)

    推荐获取IDEA注册码的网站:http://idea.lanyus.com/ 亲测好用! 也可复制下边的注册码: K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5F ...

  5. I/O方式(本章最重要)

    目录 程序查询方式 程序查询方式接口结构 例题 本节回顾 程序中断方式 中断的基本概念 工作流程 中断请求 分类 中断请求标记 中断响应 判优实现 优先级设置 中断处理过程 中断隐指令 硬件向量法 中 ...

  6. SpringBoot整合Swagger2详细教程

    1. 简介   随着前后端分离开发模式越来越流行,编写接口文档变成了开发人员非常头疼的事.而Swagger是一个规范且完整的web框架,用于生成.描述.调用可视化的RESTful风格的在线接口文档,并 ...

  7. monkey在指定的activity里面运行

    下载包地址:链接: https://pan.baidu.com/s/1Wk2eOj3saZx71Mx6pT2L4Q 提取码: gupa 运行方式:步骤1: 将工具下载下来放到本地目录下,解压步骤2:配 ...

  8. GET和POST的区别与联系

    每日知识-GET和POST HTTP:超文本传输协议 组成部分:请求行,请求头部,一个空行,请求数据 GET和POST GET:get就是获取的意思,默认的HTTP请求方式,把参数通过 key/val ...

  9. 网络编程-python实现-UDP(1.1.2)

    @ 目录 1.UDP是什么 2.代码实现 1.UDP是什么 Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol).UDP ...

  10. python初学者-使用for循环用四位数组成不同的数

    digits = (1,2,3,4) for i in digits: for j in digits: if j==i: continuefor k in digits: if k==i or k= ...