C++Primer第四章笔记 表达式
1. 左值与右值
当一个对象被用作右值得时候,用的是对象的值;当对象被用作左值的时候,用的是对象的身份。
2. 在一条语句里混用解引用和递增运算符
后置递增运算符的优先级高于解引用运算符,因此*<指针名>++等价于*(<指针名>++)
`cout << *iter++ << endl; // 要习惯于这种写法`
3. 成员访问运算符
ptr->mem 等价于 (*ptr).mem
4. 位运算符
~位求反 <<左移 >>右移 &与 ^异或 |或
5. sizeof运算符
sizeof运算符返回一条表达式或一个类型名字所占的字节数。
sizeof(type);
sizeof expr;
Sales_data data,*p;
sizeof(Sales_data);//存储Sales_data类型的对象所占的空间大小
sizeof data;//data的类型大小
sizeof p;//指针所占的空间大小
sizeof *p;//p所指类型的大小,即sizeof(Sales_data)
sizeof data.revenue;//Sales_data的revenue成员对应类型的大小
sizeof Sales_data:revenue;//同上
- 对char或者类型为char的表达式执行sizeof运算,结果为1
- 对引用类型执行sizeof运算得到被引用对象所占空间的大小
- 对指针执行sizeof运算得到指针本身所占空间的大小。
- 对解引用指针执行sizeof运算得到指针所指向的对象类型所占空间的大小,指针不需要有效(可以为空)。
- 对数组执行sizeof运算得到整个数组所占的大小,注意sizeof不会将数组转换为指针处理。
- 对string对象或者vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。
计算数组中元素的个数
constexpr size_t sz = sizeof(ia)/sizeof(*ia);
6.类型转换
如果两种类型可以相互转换,那么它们就是关联的。
在下面这些情况下,编译器会自动地转换运算对象的类型:
- 比int类型小的整型值被提升为较大的整数类型
- 条件中,非布尔型转换为布尔类型
- 初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转换为左侧运算对象的类型。
- 如果算术运算对象有多种类型,需要转换为同一种类型。
算术转换
如果某个运算对象类型不一致,这些运算对象将转换成同一种类型。
- 整型提升。如果类型匹配无须进一步转换
- 如果一个运算对象是带符号类型,另一个对象是无符号类型。
无符号>=有符号 >> 带符号的运算对象转换为无符号的
无符号<有符号 >> 如果无符号都能存在于带符号中 >>无符号转化为带符号类型
>> 否则 >>带符号类型转化为无符号
7.其他隐式类型转换
- 数组转换为指针,在大多数用到数组的表达式中,数组会自动转换为直线数组首元素的指针。当数组被作为decltype关键字的参数,或者作为取地址符(&)、sizeof以及typeid(19章)等运算符的运算对象时,不会发生转化。
- 指针转换。常量整型数0或者字面值nullptr能转换成任意类型指针;指向非常量指针能转换成void*;任意指针能转换成const void*;
- 转换成常量。允许将指向非常量类型的指针转换成指向对应的常量类型的指针。
- 类类型定义的转换。类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换
8.显示转换
命名的强制类型转换
cast-name(expression)
cast-name 包括:static_cast, dynamic_cast, const_cast, reinterpret_cast
- static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast
double slope = static_cast<double> (j)/i; //
将较大类型赋值给较小类型非常有用,如此就关闭了编译器发出的警告(精度损失),告诉编译器我知道并且不在乎损失 - const_cast
只能改变运算对象的底层const,将常量对象改为非常量对象。 - reinterpret_cast
为运算对象的位模式提供低层次上的重新解释
int *ip;
char *pc = reinterpret_cast<char*>(ip);//pc所指真实对象是一个int而非字符
string str(pc);//如果把pc当作普通的字符指针可能引起错误
- 旧式类型转换
type (expr);//函数形式的强制类型转换
(type) expr;//C语言风格的强制类型转换
char *pc = (char *)ip;//ip是指向整数的指针
//效果与使用reinterpret_cast一样
建议程序员避免使用强制类型转换,减少错误的发生