类型转换

考虑下列例子:

 

     int ival = 0;

     ival = 3.541 + 3; // typically compiles with a warning

 

ival 的值为 6

 

 

首先做加法操作,其操作数是两个不同类型的值:3.541 double 型的字面值常量,而 3 则是 int 型的字面值常量。C++ 并不是把两个不同类型的值直接加在一起,而是提供了一组转换规则,以便在执行算术操作之前,将两个操作数转换为同一种数据类型。这些转换规则由编译器自动执行,无需程序员介入——有时甚至不需要程序员了解。因此,它们也被称为隐式类型转换。

 

 

C++ 定义了算术类型之间的内置转换以尽可能防止精度损失。通常,如果表达式的操作数分别为整型和浮点型,则整型的操作数被转换为浮点型。本例中,整数3被转换为 double 类型,然后执行浮点类型的加法操作,得 double 类型的结果 6.541。下一步是将 double 类型的值赋给 int 型变量 ival。在赋值操作中,因为不可能更改左操作数对象的类型,因此左操作数的类型占主导地位。如果赋值操作的左右操作数类型不相同,则右操作数会被转换为左边的类型。本例中,double 型的加法结果转换为 int 型。double int 的转换自动按截尾形式进行,小数部分被舍弃。于是 6.541 变成 6,然后赋给 ival。因为从 double int 的转换会导致精度损失,因此大多数编译器会给出警告。例如,本书所用的测试例程的编译器给出如下警告:

     warning: assignment to 'int' from 'double'

 

 

编译器在必要时将类型转换规则应用到内置类型和类类型的对象上。在下列情况下,将发生隐式类型转换:

在混合类型的表达式中,其操作数被转换为相同的类型:

     int ival;

     double dval;

     ival >= dval // ival converted to double

用作条件的表达式被转换为 bool 类型:

     int ival;

     if (ival)   // ival converted to bool

     while (cin) // cin converted to bool

条件操作符(?:)中的第一个操作数以及逻辑非(!)、逻辑与(&&)和逻辑或(||)的操作数都是条件表达式。出现在 ifwhilefor do while 语句中的同样也是条件表达式。

用一表达式初始化某个变量,或将一表达式赋值给某个变量,则该表达式被转换为该变量的类型(不可能更改左操作数对象的类型)

     int ival = 3.14; // 3.14 converted to int

     int *ip;

     ip = 0; // the int 0 converted to a null pointer of type int *

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值