4.1 基本问题
左值和右值
- 自增自减运算符作用于左值对象,解引用和下标运算符得到左值;
- decltype作用于左值得到引用类型,右值得到普通类型;
求值顺序
- 优先级一般只规定了组合方式,并未规定求值顺序以及函数的调用顺序;
- 只有 && || ?: 和, 规定了求值顺序。
4.2 算术运算符
- -号对布尔运算无效;
- 溢出运算;
- 取余运算可以为负,但不可以为浮点数;
-
−m/(n)=−n/(m)=−(m/n)
m%(−n)=m%n , (−m)%n=−(m%n)
4.3赋值运算符
如果想右结合连续赋值,就必须满足变量类型相同或可相互转化;
4.4 递增递减运算符
- 优先选择前置递增而不是后置递增;
- 后置递增运算符优先级高于解引用运算符;
4.5 位运算
- 位运算存在一定的升级扩容,但不会无限扩大;
- 有时将某个01集合用一个二进制值存储,并用位运算进行操作。
4.6 类型转换
隐式转换的整型提升
- 一般都是向更宽更大的方向变化;
- 较大的char被转换成可容纳的int,unsigned int等中最小的一类;
- unsigned short与int按照具体所占空间决定;
显示转换
static_cast 静态转换
- 当需要忽略精度时,使用显示静态转换,可以消除警告(相当于声明了就是要忽略精度);
- 不可以对底层const转换;
- 不可以实现非void类型指针之间的转换;
const_cast 常量转换
只能改变底层const属性;dynamic_cast 动态转换
- 具有运行时类型检查的特性,只能被使用在将变量转化为类的指针/类的引用/void*时;
- 进行父类子类之间的显示转换时更加安全;
reinterpret_cast 重解释转换
- 可以实现指针的非void类型之间的转换;
- 是一个非常危险的行为;