ch4 表达式
4.1 基础
4.2 算术运算符
4.3 逻辑和关系运算符
4.4 赋值运算符
4.5 递增和递减运算符
4.6 成员访问运算符
4.7 条件运算符
4.8 位运算符
4.9 sizeof运算符
4.10 逗号运算符
4.11 类型转换
4.12 运算符优先级表
4.1 基础
- C++ 定义了一元运算符、二元运算符和三元运算符。
函数调用也是一种特殊的运算符,运算对象数量没有限制
- 表达式求值中,
运算对象类型转换
- 重载运算符:当运算符作用于类类型的运算对象时,用户可自行定义含义。使用重载运算符时,其包括
运算对象的类型和返回类型,都是由该运算符定义的
;但是运算对象的个数、运算符优先级和结合律
都是无法改变的 - 优先级、结合律、括号无视普通的组合规律
- 求值顺序,如
f1()*f2()
中哪个函数先被调用(未明确规定);对于未指定求值顺序的运算符,若表达式指向并修改了同一个对象,则行为未定义。如cout<<i<<i++;
编译顺序未知 - 建议:1、拿不准优先级和结合律时,用括号。2、若表达式某处改变了某对象的值,则其他地方不要使用它。例外:
*++iter
4.2 算术运算符
- 一元运算符优先级>乘法和除法>加法和减法;优先级相同时按照从左向右的顺序进行组合
- 在表达式求值之前,小整数类型的运算对象被提升成较大的整数类型,所有运算对象最终会转换成同一类型
- 一元正号运算符、加法运算符和减法运算符都能作用于指针。当一元正号运算符作用于一个指针或者算术值时,返回运算对象值的一个(提升后的)副本。一元负号运算符对运算对象值取负后,返回其(提升后)副本,布尔值不应该参与运算
bool b=true;bool b2=-b //b2是true
,对于是大多数运算符来说,布尔类型的运算对象将被提升为int类型,如上线转换为1,然后-1,再转换为