C++中表达式中的转换

C++中表达式中的转换

当同一个表达式中包含两种不同的算术类型时,将出现什么情况呢?在这种情况下,C++将执行两种自动转换:首先,一些类型在出现时便会自动转换;其次,有些类型在与其他类型同时出现在表达式中时将被转换。
先来看看自动转换。在计算表达式时,C++将bool、char、unsigned char、signed char 和 short 值转换为int。具体地说,true被转换为1,false被转换为0。这些转换被称为整型提升(integralpromotion)。例如,
请看下面的语句:

short chickens=20; // line 1
short ducks=35; // line 2
short fowl=chickens +ducks; //line 3

为执行第3行语句,C++程序取得chickens和ducks的值,并将它们转换为int。然后,程序将结果转换为short类型,因为结果将被赋给一个short 变量。这种说法可能有点拗口,但是情况确实如此。通常将int类型选择为计算机最自然的类型,这意味着计算机使用这种类型时,运算速度可能最快。
还有其他一些整型提升:如果shont比int短,则unsigned short 类型将被转换为int;如果两种类型的长度相同,则 usigned short 类型将被转换为 unsigned int。这种规则确保了在对 unsigned short进行提升时不会损失数据。
同样,wchart被提升成为下列类型中第一个宽度足够存储 wchar_t取值范围的类型: int、unsigned intlong 或unsigned long.
将不同类型进行算术运算时,也会进行一些转换,例如将int和 foat 相加时。当运算涉及两种类型时,较小的类型将被转换为较大的类型。例如,程序清单3.11中的程序用9.0除以5。由于9.0的类型为 double,因此程序在用5除之前,将5转换为 double 类型。总之,编译器通过校验表来确定在算术表达式中执行的转换。C++11对这个校验表稍做了修改,下面是C++11版本的校验表,编译器将依次查阅该列表。
(1)如果有一个操作数的类型是long double,则将另一个操作数转换为 long double.
(2)否则,如果有一个操作数的类型是double,则将另一个操作数转换为 double。
(3)否则,如果有一个操作数的类型是foat,则将另一个操作数转换为 float。
(4)否则,说明操作数都是整型,因此执行整型提升。
(5)在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
(6)如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。
(7)否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
(8)否则,将两个操作数都转换为有符号类型的无符号版本。
ANSIC遵循的规则与ISO2003C++相同,这与前述规则稍有不同;而传统K&RC的规则又与 ANSIC稍有不同。例如,传统C语言总是将foat提升为double,即使两个操作数都是foat。
前面的列表谈到了整型级别的概念。简单地说,有符号整型按级别从高到低依次为1onglong、long、int、short和 signed char。无符号整型的排列顺序与有符号整型相同。类型 char、signed cha和 unsigned char 的级别相同。类型bool的级别最低。wchar_t、char16t和char32t的级别与其底层类型相同。

对C++感兴趣的朋友点这里:C/C++课程

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值