C++ 表达式



左值:是指那些求值结果为对象或函数的表达式。一个表示对象的非常量左值可以作为赋值运算符的左侧对象。

右值:是指一种表达式,其结果是值,并非值所处的位置。

左值可以位于赋值语句的左侧(也可以在赋值语句的右侧)(**常量对象不能在赋值表达式的左侧),右值则不行。当一个对象呗用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(对象在内存的位置)。

移位运算符>>/<< (与输入输出使用的重载版本是一样的),移位运算符的优先级比算数运算符低,比关系运算符、赋值运算符和条件运算符高。

位与&,位或|,位异或运算^~求反运算符,在两个运算对象逐位执行(二进制位)相应的逻辑操作。

短路与&&,短路或||!逻辑非  

条件运算符(?;

sizeof运算符:返回一条表达式或一个类型名字所占的字节数。sizeof 有两种形式:

sizeof (type), sizeof expr(返回表达式结果类型的大小)

sizeof运算结果的类型依赖于其作用的类型:

  1. 对于char或类型为char的表达式执行sizeof运算,结果为1

  2. 对引用类型执行sizeof运算得到被引用对象所占空间的大小

  3. 对指针执行sizeof运算得到指针本身所占空间的大小

  4. 对解引用指针sizeof运算得到指针指向的对象所占空间大小,指针不需要有效(没有被初始化)

  5. 对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和。

  6. string对象和vector执行sizeof运算只返回该类型固定部分的大小, 不会计算对象中元素占用了多少空间。

     

    类型转换(隐式转换和显示转换)

    整型转换:负责把小整数类型转换为大整数类型

    无符号类型的运算对象:

    如果一个运算对象是无符号类型、另一个运算对象是带符号类型,其中无符号类型不小于带符号类型,那么带符号类型转换为无符号类型。当带符号类型大于无符号类型时,此时转换结果依赖于机器。如果无符号类型的所有值能够存在带符号类型中,则无符号类型转换为带符号类型;如果不能那么带符号类型转换为无符号类型。

    数组转换成指针:在大多数用到数组的表达式中,数组会自动转换成指向数组元素首元素的指针。但是,当数组被用作delctype的参数,或者作为取地址符(&)sizeoftypeid等运算符的运算对象时,上述的转换不会发生。同样,用一个引用来初始化数组,也不会转换。

    显示转换(强制类型转换)cast-name(expression)caststatic_castdynamic_castconst_castreinterpret_cast中的一种。

    static_cast对于需要把一个较大的算术类型复制给较小的类型时,它是有用的。告诉编译器不在乎精度的损失。一般如果编译器发现一个较大的算术类型试图复制给较小的类型时,就会给出警告,但当执行了显示转换后,警告信息就被关闭了。

    static_case对于编译器自动无法自动执行的类型转换也很有用。如:可以使用static_case找回存在于void*指针中的值。void *p = &d; double *dp = static_cast(p)。但要确保转换后的得到的类型就是指针所指的类型。类型一旦不符,将产生未定义的后果。

    const_cast:只能改变运算对象的底层const,对于将常量对象转换为非常量对象的行为,一般称其为“去掉const性质”, 一旦去掉了某个对象的const性质,编译器就不再阻止对该对象进行写操作了。如果对象本身不是一个常量,使用强制类型转换获得写权限是可以的。

    如果对象是一个常量,使用const_cast执行写操作就会产生未定义的后果。

    如:const char *pc; char *p = const_cast(pc)

你可能感兴趣的:(C++)