C++ Primer:第4章 表达式
第4章:表达式
4.1 基础
基本内容:
- 一元运算符、二元运算符、三元运算符、函数调用(特殊的运算符)。
- 运算符的优先级和结合律,运算对象的求值顺序。
- 运算对象转换,重载运算符,左值和右值。
备注:
- 左值使用对象的身份(位置),右值使用对象的值(内容)。左值可替换右值,反之不行。
- 明确求值顺序的4个运算符:与(&&) ,或(|| ),条件(?: ),逗号(,)。
4.2 算术运算符
基本内容:
- 一元正号(+)、一元负号(-)。
- 乘(*)、除(/)、取余(%)。
- 加(+)、减(-)。
备注:
- 算术运算符满足左结合律,其运算对象和求值结果都是右值。
- 布尔值不应参与运算。
- 算术表达式可能因为除数为0或溢出等情况产生未定义结果。
- 除法会删除余数,商一律向0取值;取余的运算对象必须是整数,m%(-n)等价于m%n,(-m)%n和(-m)%(-n)等价于-(m%n) 。
4.3 逻辑和关系运算符
基本内容:
- 逻辑非(!)。
- 小于(<),小于等于(<=),大于(>),大于等于(>=).
- 相等(=),不相等(!=)。
- 逻辑与(&&)。
- 逻辑或(||)。
备注:
- 除逻辑非(!)是右结合律外,其它逻辑和关系运算符都是左结合律。所有逻辑和关系运算符的运算对象和求值结果都是右值。
- 逻辑与(&&)和逻辑或(||)使用短路求值(只有左侧对象无法推出结果时才会计算右侧对象)。
- 引用类型可避免对过大元素的拷贝。
- 比较运算时,除非比较对象是布尔型,否则不要用true和false。
4.4 赋值运算符
基本内容:
- 赋值(=)。
- 符合赋值运算符(+=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=)
备注:
- 赋值运算符满足右结合律,赋值运算结果是左侧运算对象,它是一个可修改的左值。
- 初始化!=赋值。若左侧运算对象是内置类型,赋值时初始值列表最多包含一个值,而初始化可以是多个。如int i1[3] = {1, 2, 3};是对的,int i2[3];i2 = {1, 2, 3};是错的。
- 复合运算符等价于a = a op b;
4.5 递增和递减运算符
基本内容:
- 递增(++),递减(–)。
- 前置版本将对象本身作为左值返回,后置版本将对象原始值的副本作为右值返回。
备注:
- 除非必须,否则不要使用后置版本。因为后置版本需存储原始值作为返回值,编译器开销更大。
- 后置递增(递减)运算符优先级>解引用运算符。*p++等价于*(p++)。
4.6 成员访问运算符
基本内容:
- 点运算符(.), 箭头运算符(->)。
- ptr->men等价于(*ptr).men。
- 优先级:点运算符、箭头运算符 > 递增递减运算符 > 解引用运算符。
4.7 条件运算符
基本内容:
- 条件运算符(?:)
- 条件运算符形式:cond ? exp1 : exp2。若cond 为真则执行exp1 ,否则执行exp2。
- 条件运算的嵌套层数最好不超过两到三层。
4.8 位运算符
基本内容:
- 位求反(~)。
- 左移(<<),右移(>>)。
- 位与(&)。
- 位异或(^)。
- 位或(|)
备注:
- 位运算符的运算对象是整型,用于设置和检查二进制位。
- 位运算符尽量只用于处理无符号整数,有符号整数的符号位无明确处理方法,具体依赖于机器。
- 移位运算符(<<和>>)满足左结合律,右侧运算对象不能为负,且小于结果位数。
4.9 sizeof运算符
基本内容:
- sizeof运算符形式:sizeof (type) 或sizeof expr。
- sizeof满足右结合律,与解引用运算符优先级相同。
4.10 逗号运算符
基本内容:
- 逗号运算符先算左侧表达式,丢弃其结果,再算右侧表达式,返回其结果。
4.11 类型转换
基本内容:
- 隐式转换:算术转换,整型提升,无符号类型转换,数组转指针,指针间转换,转换成布尔类型,转换成常量,类类型定义转换。
- 显式转换:static_cast, dynamic_cast, const_cast, reinterpret_cast。
备注:
- 避免强制类型转换。