第四章 表达式
表达式由一个或多个运算对象组成,对表达式求值得到一个结果。字面值和变量是最简单的表达式。可以把一个运算符和一个或多个运算对象组合起来生成复杂的表达式。
4.1 基础
4.1.1 基本概念
一元运算符,二元运算符,三元运算符,函数调用是一种特殊运算符,对运算对象数量没有限制。
组合运算符和运算对象(优先级、结合律、求值顺序)
运算对象转换
重载运算符
左值和右值:
在C中,左值可以位于赋值语句的左侧,右值则不可以。但在C++中,左值表达式的求值结果是一个对象或者一个函数,然而以常量对象为代表的某些左值实际上不可以作为赋值语句左侧。此外虽然某些表达式的求值结果是对象,但其为右值而非左值。综上可以总结为,当对象被用作左值时,用其在内存的位置,而用作右值用其值。
4.1.2 优先级与结合律
4.1.3 求值顺序
优先级规定了运算对象的组合方式,但没有明确对象按什么方式求值。例如:int i = f1()*f2();f1与f2在乘法之前调用,但f1与f2的调用顺序不确定。
4.2 算数运算符
溢出与其他算数运算异常
4.3 逻辑和关系运算符
短路求值:
对于逻辑与而言,仅当左侧为真才对右侧求值。
对于逻辑或而言,晋档左侧为家才对右侧求值。
4.4 赋值运算符(赋值运算满足右结合律)
4.5 递增和递减运算符
4.6 成员访问运算符
4.7 条件运算符
4.8 位运算符
位运算符可以处理有符号数,也可处理无符号数。但处理有符号数时,对符号位的处理依赖机器。因此,应将位运算符只用于处理无符号数。
4.9 sizeof运算符(返回表达式或类型名字所占的字节数)
sizeof不会执行所要求取的表达式。
4.10 逗号运算符
4.11 类型转换
4.11.1 算数转换
整型提升
4.11.2 其它隐式类型转换
数组转换成指针
指针的转换(0、nullptr、指向任意非常量的指针可以转换成void*、指向任意对象的指针可以转换成const void*)
转换成布尔类型
转换成常量(允许将指向非常量类型的指针转换成指向对应常量的指针)
类类型转换
4.11.3 显式转换