sizeof运算符
sizeof运算符返回一条表达式或者一个类型所占的字节数
对数组执行sizeof运算符得到整个数组所占空间的大小,等价于对数组中的每个元素各执行一次sizeof并求和
对string对象或者vector对象执行sizeof运算只返回该类型固定部分的大小
对引用执行sizeof返回被引用对象所占空间大小
对指针执行sizeof运算得到指针本身所占空间大小
对解引用执行sizeof运算得到指针所指对象所占空间的大小,指针不需要有效
sizeof(i)/sizeof(*i); 返回数组中i中元素数量
逗号运算符
逗号运算符含有两个运算对象,按照从左到右的顺序依次求值
逻辑与 逻辑或 条件运算符都规定了运算顺序
类型转换
int i = 3.1415 + 3; //先计算3.1415+3,最后将6.1415的小数部分舍去,赋值给i
隐式转换:
表达式中,比int类型小的转换为int类型
条件中,非bool类型转换为bool类型
初始化时,初始值转换成变量的类型;赋值中,右侧对象转换为左侧类型
算数运算过程中,小于int类型的变量都会被提升为int,若是有double类型,计算过程中都为转为double。
有符号和无符号类型的转换:无符号类型不小于带符号类型,带符号类型转换为无符号类型;无符号类型的所有值都能存在带符号类型中,则无符号转换成带符号,否则,带符号转换成无符号。
强制类型转换
static_cast //只要不包含底层const,都可以使用static_cast
int i,j;
double s = static_cast<double>(i) / j; //正确
当需要把较大的类型转换为较小的类型时,使用static_cast显示转换,编译器不会发出警告
将void*指针转换回来时,使用static_cast比较安全
void *p = &d;
double *d = static_cast<double*>(p);
const_cast //只能改变运算对象的底层const,不能使用const_cast改变表达式的类型
const char *pc;
chat *p = const_cast<char*>(pc); //正确,通过p写值是未定义的行为
chat *p = const_cast<string>(pc); //错误,不能改变类型
static_cast<string>(cp); //正确
尽量限制强制类型转换的使用