表达式基础
- 重载运算符:当运算符作用在类类型的运算对象时,用户可以自行定义其含义。
左值和右值:
-
逻辑运算符
短路求值:逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。
赋值运算符
如果赋值运算的左右侧运算对象类型不同,则右侧运算对象将转换成左侧运算对象的类型。
- 赋值运算符满足右结合律,这点和其他二元运算符不一样。
ival = jval = 0;
等价于ival = (jval = 0);
-
条件运算符
条件运算符(
?:
)允许我们把简单的if-else
逻辑嵌入到单个表达式中去,按照如下形式:cond? expr1: expr2
位运算符
位运算符是作用于整数类型的运算对象。
- 二进制位向左移(
<<
)或者向右移(>>
),移出边界外的位就被舍弃掉了。 -
sizeof运算符
返回一条表达式或一个类型名字所占的字节数。返回的类型是
size_t
。两种形式:
sizeof (type)
和sizeof expr
类型转换
隐式类型转换
比
int
类型小的整数值先提升为较大的整数类型。- 条件中,非布尔转换成布尔。
- 初始化中,初始值转换成变量的类型。
- 算术运算或者关系运算的运算对象有多种类型,要转换成同一种类型。
-
显式类型转换(尽量避免)
static_cast:任何明确定义的类型转换,只要不包含底层const,都可以使用。
double slope = static_cast<double>(j);
- dynamic_cast:支持运行时类型识别。
- const_cast:只能改变运算对象的底层const,一般可用于去除const性质。
const char *pc; char *p = const_cast<char*>(pc)
- reinterpret_cast:通常为运算对象的位模式提供低层次上的重新解释。