4. 表达式
目录
4.1 基础
4.1.1 基本概念
- 一元运算符:作用于一个运算对象(&,*解引用)
- 二元运算符:作用于两个运算对象(==,*乘法)
- 三元运算符
- 函数调用
- 组合运算符和运算对象:运算符的优先级、结合律以及运算对象的求值顺序;
- 运算对象转换:表达式求值的过程中会涉及到类型转换,小整数类型通常会被提升成较大的整数类型;
- 重载运算符:运算符作用与于类类型的对象时用户可以自行定义含义,即为已存在的运算符赋予另外一层含义,但是运算对象的个数、运算符的优先级和结合律都是无法改变的;
- 左值和右值:当对象被用作左值的时候用的是对象在内存中的位置,被用作右值的时候用的是对象的值;
4.1.2 优先级与结合律
4.1.3 求值顺序
- && 先求左侧运算对象的值,当左侧运算对象的值为真时才求右侧运算对象的值(短路求值)
- || 先求左侧运算对象的值,当左侧运算对象的值为假时才求右侧运算对象的值(短路求值)
- ?:
- ,
4.2 算术运算符
左结合律:当优先级相同时按照从左向右的顺序进行组合
4.3 逻辑和关系运算符
4.4 赋值运算符
- 左侧运算对象必须是一个可修改的左值
- 满足右结合律
- 赋值运算符优先级较低
4.5 递增和递减运算符
++/--
- 前置:首先将运算对象+1/-1,然后将改变后的对象作为求值结果
- 后置:求值结果是运算对象改变之前那个值的副本
4.6 成员访问运算符
点运算符:(*ptr).mem
箭头运算符:ptr->mem
4.7 条件运算符
cond ? expr1 : expr2;
cond条件为真时返回expr1,为假则返回expr2
条件运算符优先级非常低,在长表达式中需要在表达式两端加上括号。
4.8 位运算符
作用于整数类型的运算对象,把运算对象看成是二进制位的集合
4.9 sizeof运算符
返回一个表达式或一个类型名字所占的字节数。
4.10 逗号运算符
逗号运算符的结果是右侧表达式的值
每次循环迭代ix和cnt相应改变
4.11 类型转换
4.11.1 算术转换
把一种算术类型转换成另外一种算术类型,比如整型提升:小整数类型(bool,char,signed char,unsigned char,short,unsigned short)转换成较大的整数类型(int);
4.11.2 隐式转换
- 表达式中,比int类型小的整型值被提升为较大的整数类型;
- 在条件中,非布尔值转换成布尔值;
- 初始化中,初始值转换成变量的类型;
- 赋值中,右侧运算对象转换成左侧运算对象的类型;
- 算术运算或关系运算的运算对象有多种类型也会转换成同一种类型;
- 函数调用时也会发生类型转换;
4.11.3 显示转换
命名的强制类型转换(需要避免强制类型转换):
- type:转换的目标类型
- expression:要转换的值
- cast-name:static_cast,dynamic_cast,const_cast,reinterpret_cast
static_cast:任何具有明确定义的类型转换
dynamic_cast:支持运行时类型识别
const_cast:只能改变运算对象的底层const
reinterpret_cast:为运算对象的位模式提供较低层次上的重新解释(没懂,别用)
4.12 运算符优先级表