左值和右值
当一个对象被用作右值,用的是对象的值(内容);当对象被用作左值,用的是对象的身份(在内存中的位置);
重要原则:左值可以当成右值使用,右值不可以当作左值使用。当左值被当成右值使用时,实际使用的是它的内容。
求值顺序
有四种运算符规定了求值顺序。(&&),(||),(?: ),(,)。
bool b=true;
bool b2=-b;b2是true(-1)
bool值不应该参与运算,对大多数运算符来说bool型运算对象被提升为int。
整数相除结果还为整数,商的小数部分被丢弃。
取余操作的运算对象必须为整数。
逻辑和关系运算符
关系运算符作用于算数或指针类型,逻辑运算符作用于任意能转换成bool值的类型。逻辑运算符和关系运算符的返回值都是bool型。
进行比较运算时除非比较对象为bool类型,否则不用bool值字面值true和false作为运算对象。
赋值运算符
赋值运算符满足右结合律。
赋值运算符优先级低于关系运算符的优先级,所以在条件语句中,赋值部分通常加括号。
递增和递减运算符
前置版本和后置版本
前置:将运算对象+1,然后将改变后的对象作为求值结果。
后置:将运算对象+1,但求值结果时运算对象改变之前那个值的副本。
除非必须,否则不用递增递减运算符的后置版本。
auto p=v.begin();
while(p!=v.end()&&*p>=0)
cout<<*p++<<endl;
*p++等价于 * (p++),p++把p的值+1,然后返回p的初始值副本作为求值结果。
成员访问运算符
表达式ptr->mem等价于(*ptr).mem;
条件运算符
?:条件运算符满足右结合律,运算对象一般按照从右向左顺序组合。
位运算符
逻辑操作:&&、||、!。
位运算符:&、|、^。
sizeof运算符
返回一条表达式或一个类型名字所占用的字节数。
对char或者类型为char表达式执行sizeof运算,结果为1
对引用类型执行sizeof得到引用对象所占空间大小
对指针执行sizeof得到指针本身所占空间大小
对解引用指针执行sizeof得到指针指向对象所占空间大小,指针不需要有效
对数组执行sizeof得到整个数组所占空间大小,sizeof不会把数组转换成指针处理。
对string或vector对象执行sizeof运算只返回该类型固定部分大小,不会计算对象中的元素占用多少空间。
因为sizeof返回值是常量表达式,可以用sizeof的结果声明数组的维度。
类型转换
隐式转换
数组转换成指针:在大多数数组表达式中,数组自动转换成指向数组首元素的指针。
指针的转换:常量整数值0或者字面值nullptr可以转换成任意指针类型;指向任意非常量的指针能转换成void*;指向任何对象的指针能转换成const void*
显式转换
命名的强制类型转换
cast-name< type >(expression);
cast-name:static_cast、dynamic_cast、const_cast、reinterpret_cast