左值:是指那些求值结果为对象或函数的表达式。一个表示对象的非常量左值可以作为赋值运算符的左侧对象。
右值:是指一种表达式,其结果是值,并非值所处的位置。
左值可以位于赋值语句的左侧(也可以在赋值语句的右侧)(**常量对象不能在赋值表达式的左侧),右值则不行。当一个对象呗用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(对象在内存的位置)。
移位运算符>>/<< (与输入输出使用的重载版本是一样的),移位运算符的优先级比算数运算符低,比关系运算符、赋值运算符和条件运算符高。
位与&,位或|,位异或运算^,~求反运算符,在两个运算对象逐位执行(二进制位)相应的逻辑操作。
短路与&&,短路或||,!逻辑非
条件运算符(?; )
sizeof运算符:返回一条表达式或一个类型名字所占的字节数。sizeof 有两种形式:
sizeof (type), sizeof expr(返回表达式结果类型的大小)
sizeof运算结果的类型依赖于其作用的类型:
对于char或类型为char的表达式执行sizeof运算,结果为1
对引用类型执行sizeof运算得到被引用对象所占空间的大小
对指针执行sizeof运算得到指针本身所占空间的大小
对解引用指针sizeof运算得到指针指向的对象所占空间大小,指针不需要有效(没有被初始化)
对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和。
对string对象和vector执行sizeof运算只返回该类型固定部分的大小, 不会计算对象中元素占用了多少空间。
类型转换(隐式转换和显示转换)
整型转换:负责把小整数类型转换为大整数类型
无符号类型的运算对象:
如果一个运算对象是无符号类型、另一个运算对象是带符号类型,其中无符号类型不小于带符号类型,那么带符号类型转换为无符号类型。当带符号类型大于无符号类型时,此时转换结果依赖于机器。如果无符号类型的所有值能够存在带符号类型中,则无符号类型转换为带符号类型;如果不能那么带符号类型转换为无符号类型。
数组转换成指针:在大多数用到数组的表达式中,数组会自动转换成指向数组元素首元素的指针。但是,当数组被用作delctype的参数,或者作为取地址符(&),sizeof及typeid等运算符的运算对象时,上述的转换不会发生。同样,用一个引用来初始化数组,也不会转换。
显示转换(强制类型转换):cast-name<type>(expression),cast是static_cast、dynamic_cast、const_cast和reinterpret_cast中的一种。
static_cast对于需要把一个较大的算术类型复制给较小的类型时,它是有用的。告诉编译器不在乎精度的损失。一般如果编译器发现一个较大的算术类型试图复制给较小的类型时,就会给出警告,但当执行了显示转换后,警告信息就被关闭了。
static_case对于编译器自动无法自动执行的类型转换也很有用。如:可以使用static_case找回存在于void*指针中的值。void *p = &d; double *dp = static_cast<double*>(p)。但要确保转换后的得到的类型就是指针所指的类型。类型一旦不符,将产生未定义的后果。
const_cast:只能改变运算对象的底层const,对于将常量对象转换为非常量对象的行为,一般称其为“去掉const性质”, 一旦去掉了某个对象的const性质,编译器就不再阻止对该对象进行写操作了。如果对象本身不是一个常量,使用强制类型转换获得写权限是可以的。
如果对象是一个常量,使用const_cast执行写操作就会产生未定义的后果。
如:const char *pc; char *p = const_cast<char*>(pc)