(4)表达式

来源:互联网 发布:python源代码下载 编辑:程序博客网 时间:2024/06/18 04:34
  1. 小整数类型(如 char、bool、short等)通常会被提升成较大的整数类型,主要是int(120)。
  2. 我们使用重载运算符时,其包括运算对象的类型和返回值的类型,都是由该运算符定义的;但是运算对象的个数、运算符的优先级和结合律都是无法改变的。当一个对象被用做右值的时候,用的是对象的值(内容);当对象被用做左值的时候,用的是对象的身份(在内存中的位置)。如果表达式的求值结果是左值,decltype作用于该表达式(不是变量)得到一个引用类型(121)。
  3. 运算运算符满足左结合律,意味着如果运算符的优先级相同,将按从左向右的顺序组合运算对象(122)。
  4. 以下两条经验准则对书写复合表达式有益:①拿不准的时候最好用括号来强制让表达式的组合关系符合程序逻辑的要求;②如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象(一个重要的例外是:当改变运算对象的子表达式本省就是另外一个子表达式的运算对象时本规则无效)。当一元正号运算符作用于一个指针或者算术值时,返回运算对象值的一个(提升后的)副本。一元负号运算符对运算对象取负后,返回其(提升后的)副本(124)。
    5.运算符 % 取余,负责计算两个整数相除所得的余数。参与取余运算的运算对象必须是整数类型。在除法运算中,C++11标准规定商一律向0取整(即直接切除小数部分)(125) 。
  5. 赋值运算符,在C++11标准中,用花括号构建初始值列表的时候,不允许窄化转换。也即是说,如果左侧运算对象时内置类型,那么初始值列表最多只能包含一个值,而且该值即是转换的话其所占空间也不应该大于目标类型的空间(129)。
  6. 前置版本将对象本身作为左值返回,后置版本则将对象原始值的副本作为右值返回。如果 ptr是一个有效迭代器,那么 *ptr++ 表示输出刚开始指向的值,并将迭代器移动到下一个位置(132)。
  7. C++中大多数运算符没有规定运算对象的求值顺序(注意)。ptr->mem 等价于(*ptr).men 箭头运算符作用于一个指针类型的运算对象,结果是一个左值。点运算符分为两种情况:如果成员所属的对象时左值,那么结果是左值;反之,如果成员所属的对象时右值,那么结果是右值(133)。
  8. 当条件运算符的两个表达式都是左值或者能转换成同一种左值类型时,运算的结果是左值;否则运算的结果是右值。条件运算符满足右结合律,意味着运算对象(一般)按照从右向左的顺序组合(134)。
  9. 对于位运算符,一般来说,如果运算对象是“小整型”,则它的值会被自动提升成较大的整数类型。关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算符用于处理无符号位(136)。
  10. sizeof运算符返回一条表达式或一个类型名字所占用的字节数。sizeof运算符满足又结合律,其所得的值是一个size_t类型常量表达式。运算符的运算对象有两种形式:①siezeof (type) 和 ②sizeof expr返回的是表达式结果类型的大小。注意的是:在sizeof的运算对象中解引用一个无效指针仍然是一种安全的行为,因为指针实际上并没有被真正使用,sizeof不需要真的解引用指针也能知道它所指对象的类型。C++11新标准允许我们使用作用域运算符来获取类成员的大小。通常情况下只有通过类的对象才能访问到类的成员,但是sizeof运算符无须我们提供一个具体的对象,因为想要知道类成员的大小无须真的获取该成员(139)。
  11. 对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所用的元素各执行一次sizeof运算并将各个结果求和。注意,sizeof运算不会把数组转换成指针来处理。对string对象或者vector对象执行sizeof运算只能返回该类型的固定部分的大小,不会计算对象中的元素占用了多少空间(140)。
  12. 对于逗号运算符来说,首先对左侧的表达式求值,然后将求值结果丢弃。逗号运算符真正的结果是右侧表达式的值。如果右侧运算对象时左值,那么最终的求值结果也是左值(140)。
  13. 数组转换成指针(在几个条件下不能发生(143));指向任意非常量的指针能转换成 void*;指向任意对象的指针能转换成 const void*。转换成常量:允许将指向非常量类型的指针转换成指向相应的常量类型的指针,对于引用也是这样(143)。类类型定义的转换:类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一中类型的转换(144)。
  14. 命名的强制类型转换:①static_cast:任何具有明确定义的类型转换,只要不包含const,都可以使用static_cast。当需要把一个较大的算术类型赋值给较小的类型时,static_cast非常有用。同时它对于编译器无法自动执行的类型转换也非常有用。②const_cast:只能改变运算对象的底层const。如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为。然而如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的行为。不能用const_cast改变表达式的类型。const_cast常常用于有函数重载的上下文中。③reinterpret_cast:通常为运算对象的位模式提供较低层次的重新解释。
0 0