4.1 基础

  • 函数调用也是一种特殊的运算符,它对运算对象的数量没有限制。
  • C++ 的表达式要么是左值,要么是右值。左值可以位于赋值语句的左边,右值则不可以。
  • 当一个对象被用作右值的时候,用的是对象的值;当对象被用作左值的时候,用的是对象的身份。
    【mark】
  • 优先级规定了运算对象的组合方式,但是没有说明运算对象的求值顺序,一般不会明确指定求值顺序。
  • 对于没有指定执行顺序的运算符,如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为。
cout << i << ++i << endl; // 未定义的

4.2 算术运算符

  • 算术运算符的运算对象和求值结果都是右值。
  • 在表达式求值之前,小整数类型的运算对象被提升成较大的整数类型,所有运算对象最终会转换成同一类型。
  • 一元正(负)号运算符作用于一个指针或者算数值时,返回运算对象(取负)的提升后的副本。
bool b = true;
bool b2 = -b; // b2 is true
  • m = (m / n) * n + m % n,则 m % n 符号与 m 相同。

4.3 逻辑和关系运算符

  • 逻辑和关系运算符的运算对象以及求值结果都是右值。
  • 相等性测试与布尔字面值
if (val) {} // 如果 val 是任意的非 0 值
if (!val) {} // 如果 val 是 0
if (val == true) // 如果 val 等于 1

4.4 赋值运算符

  • 赋值运算符的左侧对象必须是一个可修改的左值。
int i = 0, j = 0, k = 0; // 初始化而非赋值
const int ci = i; // 初始化而非赋值
1024 = k; // 错误 字面值是右值
i + j = k; // 错误 算术表达式是右值
ci = k; // 错误 ci 是常量左值
  • 赋值运算的结果是它的左侧对象,并且是一个左值,结果的类型是左侧运算对象的类型。
  • 赋值运算符满足右结合律。

4.5 递增和递减运算符

  • 递增和递减运算符有两种形式:前置版本 ++i 和后置版本 i++。这两种运算符必须作用于左值运算对象,前置版本将对象本身作为左值返回,后置版本将对象原始值的副本作为右值返回。
  • 除非必须,否则不用递增和递减运算符的后置版本。

4.6 成员访问运算符

  • ptr->mem == (*ptr).mem

4.7 条件运算符

4.8 位运算符

  • 位运算符的运算对象如果是“小整型”,则会被自动提升为整数类型。
  • 位运算符如何处理带符号数的符号位是未定义的,因此建议仅将位运算符用于处理无符号数。
  • 移位运算符(IO运算符)满足左结合律。

sizeof 运算符

  • sizeof 运算符返回一条表达式或者一个类型名字所占的字节数,返回 size_t 类型的常量表达式。
sizeof (type)
sizeof expr
  • sizeof 运算符满足右结合律。
  • sizeof 的运算对象中解引用一个无效指针是安全的,因为指针没有被真正使用。
  • 对数组执行 sizeof 运算得到整个数组的大小,对 sting 或 vector 执行 sizeof 运算只返回该类型固定部分的大小。

4.10 逗号运算符

  • 逗号运算符先对左侧的表达式求值,然后将结果丢弃掉,再对右侧的表达式求值,返回右侧的结果。

4.11 类型转换

  • 算术转换:运算符的运算对象将转换成最宽的类型。
  • 整型提升:转换后的类型要容纳原类型所有可能的值。
  • 如果一个运算对象是无符号类型,另一个是带符号类型:
    无符号类型不小于带符号类型:带符号类型转成无符号类型;
    带符号类型大于无符号类型:转换结果依赖于机器;
  • 指针的转换
    常量整数值 0 或者字面值 nullptr 能转换成任意指针类型;
    指向任意非常量的指针能转成 void
    指向任意对象的指针能转成 const void
  • 转换成布尔类型:指针或算术值为 0,结果为 false,否则为 true。
  • 转换成常量:允许将指向非常量的指针(引用)转换成相应的常量指针(引用)。
  • 类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一次类类型的转换。
  • 强制转换
cast-name <type> (expression)
  • static_cast
// 把一个较大的算术类型赋值给较小的类型。
double slope = static_cast<double>(j) / i;
// 找回存在于 void* 指针的值
double *p = static_cast<double*>(p);
  • const_cast
// 改变运算对象的底层 const
const char *pc;
char *p = const_cast<char*>(pc);
  • reinterpret_cast
// todo

转载于:https://www.cnblogs.com/eathen/p/6599498.html

C++ Primer 5 CH4 表达式相关推荐

  1. C++ Primer 学习笔记(第四章:表达式)

    2019独角兽企业重金招聘Python工程师标准>>> ##C++ Primer 学习笔记(第四章:表达式) [TOC] ###4.1 基础 左值和右值: 当一个对象被用作右值的时候 ...

  2. C++Primer 第10章lambda表达式

    C++Primer 第10章lambda表达式 泛型编程 咱们继续高歌猛进,下面我给大家继续讲关于算法的故事. 我们知道标准库容器中定义的算法大多数独立在算法之外,通常这些算法是通用的.它们可以处理不 ...

  3. C++ Primer Plus(嵌入式公开课)---第5,6章 循环和关系表达式 分支语句和逻辑运算符

    20220222 C++ Primer Plus - 第五.六章 附录: 1.ASCII码字符对照表 2.C++ 运算符优先级 第1-3章 第4章 复合类型 第5章 循环和关系表达式 5.1 for循 ...

  4. 《C Primer Plus》中文第六版 编程练习答案 第五章 运算符、表达式和语句

    C Primer Plus 第5章 运算符.表达式和语句 编程练习答案 ***先说一下关于 i++和 ++i 情况.*** 1.编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时间.使用#de ...

  5. C Primer Plus 第6章 C控制语句:循环 6.3 关系运算符和表达式

    2019独角兽企业重金招聘Python工程师标准>>> 关系运算符 运算符 含义 < 小于 <= 小于等于 == 等于 >= 大于等于 > 大于 != 不等于 ...

  6. 【C语言学习】《C Primer Plus》第5章 运算符、表达式和语句

    学习总结 1.有了一定的语言基础,运算符和表达式这些都大同小异,无外乎赋值运算符(=).算术运算符(+.-.*./.%.++.--)和其他的一下运算符(sizeof.(type)). 2.声明一个参数 ...

  7. C++ Primer 5th笔记(chap 17 标准库特殊设施)子表达式subexpression

    1. 正则表达式的模式通常包含一个或多个子表达式 通常用括号表示子表达式 eg. r 有两个子表达式: 第一个是点之前表示文件名的部分, 第二个表示文件扩展名 regex r ("([[:a ...

  8. C++ Primer 5th笔记(4)chapter4 表达式

    4.1 重载运算符overloaded operator 定义:运算符作用于内置类型和复合类型的运算对象时所执行的操作. 4.2 左值和右值 当一个对象被用作右值的时候,用的是对象的值(内容): 当对 ...

  9. C++Primer学习笔记:第4章 表达式

    表达式由一个或多个运算对象组成,对表达式求值将得到一个结果.字面值和变量是最简单的表达式,其结果就是字面值和变量的值.把一个运算符和一个或多个运算对象组合起来可以生成较复杂的表达式. 重载运算符包括运 ...

最新文章

  1. js 时间戳转为日期格式
  2. 带你了解两种线性规划的方法:稀疏矩阵存储和预处理
  3. oracle树子类遍历父类_不懂数据库索引的底层原理?那是因为你心里没点b树
  4. h5带mysql数据库的留言板_【mysql】用PHP写留言板,有回复功能,要写入数据库。...
  5. 一文详解YOLOX算法实现血细胞检测
  6. 重磅!国内首个三维重建系列视频课程,涉及SFM、立体匹配、多视图几何、结构光等...
  7. 特教学校计算机课,特教学校引入编程课 为听障孩子打开智能之门
  8. 盛迈坤电商:店铺自然流量怎么提升
  9. 内网自建yum源和apt源(含各信创系统)
  10. 优惠券制作和分配(含代码)
  11. raspberry pi_我如何从Mac Mini迁移到Raspberry Pi
  12. 处理ORA-06512错误方法
  13. 跑得快—扑克牌游戏出牌规则(JavaScript)
  14. ADI Blackfin DSP处理器-BF533的开发详解7:SPI接口的驱动和应用(含源代码)
  15. 计算机底层:高速缓冲存储器
  16. PSPad css编辑工具
  17. Python 学习 --->Anaconda、pyenv、virtualenv、venv
  18. idea 切换分支时书签消失解决方案
  19. 桂电计算机网络试卷d卷答案,计算机网络期末考试试卷及答案模板.doc
  20. 【日语】【歌词】「Lemon」--米津玄师

热门文章

  1. Tomcat开发Web项目基本结构
  2. c语言联合验证大小端存储,2021C语言面试题及答案.docx
  3. u6系统服务器启动不了,u6链接不到服务器
  4. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](3)
  5. linux 文件系统---类型、创建、
  6. python找零钱问题_Python基于回溯法子集树模板解决找零问题示例
  7. cpu开核_电脑魔改篇——CPU散热器
  8. 『ACM-算法-二分法』算法竞赛进阶指南--在单调递增序列a中查找大于等于X的数中最小的一个,即X或X的后继
  9. 疯子的算法总结(三) STL Ⅱ迭代器(iterator) + 容器
  10. 模拟实现EXT2文件系统