4.1 基础
- 要求 二元运算符两侧的数据类型 相同 或者可以转化成 同一类型
- 左值, 使用对象的身份, 即其在内存中的地址
- 右值, 即使用对象的值
- decltype 作用于表达式(非变量) 得到一个引用类型
int * p = nullptr;
decltype(p) // int *
decltype(*p) // int &, 这个自己没想明白, 个人感觉应该是 int
decltype(&p) // int **
- 如果在复合表达式中改变了运算对象的值, 在表达式的其他地方不要再使用这个运算对象, 容易产生未定义行为
算术运算符
- 一元负号运算符: - x
- 取余运算:
(-m)%n == -(m%n)
m%(-n) == m%n
逻辑和关系运算符
- 优先级 && > ||
- C++11 允许使用花括号括起来的初始值列表
- 赋值运算优先级较低, 常用写法
int i;
while((i = get_value()) != 42){
// further handles
}
- 除非必须, 否则不用递增递减的运算符后置表达式
- beg++ == (beg++)
- sizeof 的两种使用形式
sizeof(type)
sizeof expr
可以使用 :: 成员运算符获取部分元素的大小
特别注意: 对string 和 vector 类型执行sizeof 运算时候, 只返回该类型固定部分的大小, 不会计算对象元素占用的空间
类型提升 涉及无符号对象的时候, 有时转换可能会依赖于机器
reinterpret_cast 依赖机器, const_cast 只修改const 属性, 不改变类型
- C强制类型转换
type (expr) // 函数形式
(type) expr // C 语言风格