1、基础内容
表达式是由一个或多个运算对象组成,对表达式求值得到的是一个结果,字面值和变量时最简单的表达式。
左值和右值
当一个对象被用作右值时,使用的是该对象的值;而被用作左值时,使用的时对象的内存。
- 赋值运算符需要一个非常量左值为其左侧运算对象
- 取地址符作用于一个左值运算对象,返回一个指向该运算对象的指针,该指针为右值
- 解引用求值结果为左值
求值顺序
部分运算符是没有明确指明执行顺序的,例如<<运算符:
1 | cout<<i<<""<<++i; |
++i和i没有明确的先后关系,因此编译器可能做出任何行为。
当多个函数会影响同一对象时,当同时调用这些函数时,调用函数的顺序也没有明确的先后关系。
2、算术运算符
bool类型
bool类型原则不应参与运算,在运算时会自动转化为int型的1,只要计算结果不为0,都将返回ture
优先级
C++大部分同优先级运算都满足从左至右的规律,赋值则相反
递增运算
C++中,非必要不使用后置递增/减符(i++/i—),因为前置运算为将对象本身作为左值返回,而后置则要额外的空间存储原始值,并将这个额外存储的原始值副本作为右值返回,因此,使用后置操作会消耗更多内存,这在相对复杂的工作中是消耗巨大的。
位操作
关于符号位的处理没有明确规定,因此位运算最好用来处理无符号类型
3、类型转换
C++的类型转换格式不同于C:
1 | cast-name<类型>(表达式) |
最常用的cast-name为static_cast和const_cast
static_cast
任何有明确定义的类型转换(除了底层const)都可以使用static_cast
例:
1 | void *p = &d;//d不能为常量(底层const) |
const_cast
专用于改变底层const,其作用为改变const性质
1 | const char* pc; |
需要注意,可以有以下用法:
1 | char* pc; |