第4章 表达式
本文最后更新于:2023年8月25日 凌晨
第4章 表达式
1. 基础
一些运算符的基本概念
1.1 基本概念
重载运算符
赋予基本运算符不同的含义和运算方式,使用重载运算符时,其包括运算对象的类型和返回值的类型,都是由该运算符定义的;但是运算对象的个数、运算符的优先级和结合律都是无法改变的 。
左值和右值
左值,使用的是对象的身份(在内存中的位置);右值,使用的是对象的值(内容)。
1.2 优先级与结合律
基本的运算优先级和数学中的优先级一样。
括号无视优先级,在不确定默认的优先级时可以使用括号。
2. 算术运算符
常用算术运算符
3. 逻辑和关系运算符
逻辑和关系运算符
短路原则:
- 对于逻辑与运算符来说,当且仅当左侧运算对象为真时才对右侧运算对象求值
- 对于逻辑或运算符来说,当且仅当左侧运算对象为假时才对右侧运算对象求值
4. 赋值运算符
赋值和初始化是两个不同的概念,虽然都使用 =
运算符
1 |
|
赋值运算符满足右结合律。对于多重赋值语句中的每一个对象,它的类型或者与右边对象的类型相同、或者可由右边对象的类型转换得到
1 |
|
5. 递增和递减运算符
递增(递减)运算符有前置(++i
)和后置(i++
)
前置将运算对象加 1 (或减 1), 并返回改变后的对象;后置版本将运算对象加 1 (或减 1), 但返回改变前那个值的副本 。
如果没有特别的需求,建议使用前置的版本
e.g.:
*iter++
实现一个对象的遍历
6. 成员访问运算符
成员运算符有点运算符 和 箭头运算符
1 |
|
7. 条件运算符
条件运算符 ?:
是一个三元运算符,格式:
1 |
|
8. 位运算符
位运算符是在二进制的层面对数据操作,以下是常用的位运算符
9. sizeof 运算符
sizeof
运算符返回一条表达式或一个类型名字所占的字节数。该运算符有两种形式
1 |
|
10. 逗号运算符
逗号运算符 含有两个运算对象,按照从左向右的顺序依次求值
1 |
|
11. 类型转换
隐式转换
由编译器完成,可能会出现精度损失
显示转换
命名类型的强制类型转换,其形式如下:
1 |
|
其中type
是转换的目标类型而 expression
是要转换的值。如果 type
是引用类型,则结果是左值。
cast-name
是
static_cast
、dynamic_cast
、const_cast
、reinterpret_cast
中的一种。
static_cast , 任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast
1 |
|
const_cast, 只能改变运算对象的底层const
1 |
|
reinterpret_cast, 通常为运算对象的位模式提供较低层次上的重新解释 这里不是很明白
1 |
|