-
一个对象被用作右值,用的是对象的值
-
一个对象被用作左值,用的是对象的地址
-
左值可以当做右值使用,右值不能当做左值使用
-
一个左值被当成右值使用时,实际使用的是对象的值
-
赋值运算符需要一个左值作为其左侧运算对象,得到的结果也是一个左值
-
取地址符作用于一个左值,返回一个右值(指向该对象的指针)
- 进行算术运算时,小整型的运算对象会自动转化成较大的整型,所以运算对象最终会转换成同一类型
bool b = true; bool b2 = -b; // b2 == true;
- 布尔型不应该参数运算
对于大多数运算符,布尔型会被转为为整型。b的值为真,转化为1,求负数的结果为-1,因为-1不是0,再转换为布尔型就是true。
3. 逻辑运算符- &&和||具有短路求值特性
c = a && b; // 只有a为真时,才计算b c = a || b; // 只有a为假时,才计算b4. 递增、递减
-
前置++:首先将运算对象+1,然后将改变后的对象作为求值结果
-
后置++:首先拷贝一份运算对象,然后将运算对象+1,再返回原始运算对象的拷贝值
-
后置++的优先级高于解引用符
auto pbegin = v.begin();
while (pbegin != v.end()) {
cout << *pbegin++ << endl; // 等价于*(pbegin++)
// 后置++令pbegin值+1,返回原始pbegin
}
5. 位运算符
- 位与&:同1为1,否则为0
- 位异或^:不同为1,相同为0
- 位或|:同0为0,否则为1
- static_cast:任何具有明确意义的类型转换,不包含底层const(最常用)
int i,j; double res = static_cast(j) / i;
-
dynamic_cast: 将基类指针或引用安全地转换为派生类的指针或引用
-
const_cast:将常量对象转化为非常量对象,去掉const属性
- 去掉const属性,编译不再阻止我们对该对象进行写操作
- 如果对象本身是非常量,强制转换后进行写操作是合法行为
- 如果对象本身是常量,强制转换后进行写操作是未定义的行为
- 去掉const属性,编译不再阻止我们对该对象进行写操作
const char *cp; char *p = const(pc);
- reinterpret_cast:通常为运算对象的位模式提供较低层次上的重新解释(不使用)
int *ip; char *cp = reinterpret_cast(ip); // 此时cp指向的真实对象仍然是int



