第四章 表达式
关键
- 运算优先级
- 运算对象转换
- 重载运算符
左值与右值
- 左值本质上是对象在内存中的位置
- 右值则是使用对象的内容,即内存中的数据
- 取地址符作用于左值,结果为右值
- 解地址符,下标运算,迭代器解引用,作用于右值,结果为左值
算术运算
- 除法:C++11中规定商一律向0取整(即直接切除小数部分)
- 取余,结果符号始终于被除数相同
逻辑和关系运算符
- 与和或的计算方式,这个策略在判断下标和解地址时可以有效防止非法操作(越界)
- 比较运算时,右对象会先被转换为和左对象同一个类型
赋值运算符
赋值运算的结果是一个对象(左值)
- 赋值运算满足右结合律
因此可以用在条件判断中,但切记要区分赋值和相等比较运算符
- 下面的例子中,由于赋值运算的优先级很低,因此要加上括号
递增和递减运算符
存在前置版本和后置版本
前置版本会将运算对象+1(-1),再将改变后的对象作为求值结果,返回结果为左值
后置版本同样会将运算对象+1(-1),但是求值结果为对象改变前的副本!即返回结果为右值
应该优先使用前置版本,避免将原始值存储下来
递增和递减的运算优先级大于解地址符,所以pbeg++等价于(pbeg++)
- 但是要避免赋值语句(相同对象)和递增符号的混合使用,他们的运算顺序不确定
成员访问运算符
ptr→mem 等价于 *(ptr).mem
- 解引用运算符的优先级小于点运算符
条件运算符
- 可以嵌套且是右结合的,但是尽量不要嵌套太多,否则代码的可读性会很差
位运算符
- 位运算通常会把小整型(如short,char)转换为大整型(如int)
- 移位运算的优先级比算术运算低,但比关系,赋值,条件运算高,建议使用()
sizeof 运算符
- 有两种
- 对数组进行sizeof的运算,结果为所有元素的大小之和
- 对vector和string的sizeof运算,结果为固定的大小,而不包含其中包含的元素空间
逗号运算符
- 逗号居然是一个运算符?!
- 会把左侧的运算结果丢弃,右侧的表达式才是真正的结果
(隐式)类型转换
- 何时发生
- 算术转换
显式类型转换
- 命名的强制类型转换:
cast-name包含static_cast, const_cast, dynamic_cast, reinterpret_cast
static_cast:只要不包含底层const,则可以使用,在大类型转小类型时有用
const_cast用于删除常量的底层const,但依旧不能修改值的操作(为定义)
reinterpret_cast是对运算对象进行了位层面的重新解释,十分危险
- Title: 第四章 表达式
- Author: Huan Lee
- Created at : 2023-08-20 13:04:45
- Updated at : 2024-02-26 04:53:15
- Link: https://www.mirthfullee.com/2023/08/20/notion-第四章 表达式-88c73ea9/
- License: This work is licensed under CC BY-NC-SA 4.0.