c++的准备知识14

1.表达式中的转换。当同一个表达式中包含两种不同的算术类型时,C++将执行两种自动转换:首先,
  一些类型中出现时会自动转换:其次,有些类型中与其他类型同时出现是在表达式中时,将被转换
  先看自动转换,在计算表达式时,C++将boll,char,unsigned,char,signedchar和short值转
  换为int。具体的说true被转换为1.falsc被转换为0.这些转换被称为整形提升,例如
  short chickens = 20;
  short ducks = 35;
  short fowl = chickens + ducks;
  为执行第三行语句C++程序取得chickens和ducks的值,并将它们转换为int。然后,程序将结果转换
  为short型,因为结果将被赋给一个short变量。通常将int类型选择为计算机最自然的类型,这意味着
  计算机使用这种类型时,运算速度可以最快。
  还有一些其他提升,如果short比int短,则unsigned short类型将被转换为int:如果两种类型长度
  相同unsigned short类型转被转换成unsigned int。这种规则确保了在对unsigned short 进行提升
  时不会损失数据。


2.wchar_t被提升为下列类型中的一个宽度足够存储wchar_t取值范围的类型:int,unsigned int,long
  或unsigned long。
  将不同类型进行算术运算时,也会进行一些转换,例如将int 和float相加时,当运算设计两种类型时,
  较小的类型将被转换为较大的类型。编译器通过校验表来确定在算是表达式中执行的转换。


3.C++校验表:
  1.如果有一个操作数的类型是long double,则将另一个操作数转换为long double。
  2.否则,如果有一个操作数的类型是double,则将另一个操作转换为double。
  3.否则,如果有一个操作数类型是float,则将另一个操作转换为float。
  4.否则,说明操作数都是整型,因此执行整型提升。
  5.在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个级别低,则
    转换为级别更高的类型。
  6.如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将
    有符号操作数转换为无符号操作数所属的类型。
  7.否则,如果有符号类型可以表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属
    类型。
  8.否则,将两个操作数都转换为有符号类型的无符号版本。
  有符号整型按级别从高到低依次为long long,long,int,short和signed char。无符号整型的排列顺序
  与有符号整型相同。类型char,signed char 和unsigned char 的级别相同。类型bool的级别最低。
  wchar_t,char16_t,和char32_t的级别与其底层类型相同。


4.传递参数时的转换:传递参数时的类型转换通常由C++函数原型控制,然而,也可以取消原型对参数传递的
  控制,尽管这样并不明智。在这种情况下,C++将对char和short类型应用整型提升。另外,为毛吃与传统C
  语言中大量代码的兼容性,在将参数传递给取消原型对参数传递控制的函数时,C++将float参数提升为double。

posted @ 2016-08-11 16:38  都是木头  阅读(172)  评论(0编辑  收藏  举报