C++Primer 4.11节——类型转换——隐式转换

C++Primer 4.11节——类型转换——隐式转换

1、隐式转换
转换的过程:首先类型转换规则设法将运算对象的类型统一后再求值,上述的类型转换是自动转换的,所以被称作是隐式转换。

2、发生隐式转换的情况
①在大多数表达式中,比int类型小的整型值首先提升成较大的整数类型。
②在条件中,非布尔值转换成布尔类型。
③初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象的类型转换成左侧运算对象的类型。
④如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型。
⑤函数调用也会发生类型转换。

3、算数转换
①含义:把一种算术类型转换成另外一种算术类型。
②规则:运算符的运算对象将转换成最宽的类型。
③整型提升:负责把小整数类型转换成较大的整数类型。

4、有无符号类型的运算对象之间的类型转换
①首先执行整型提升。如果结果的类型匹配,无需进一步的转换。
②如果两个运算对象的类型是都带符号的,或者都不带符号的,则小类型的运算对象将转换成大类型。
③,如果一个运算对象是无符号类型的,另一个运算对象是有符号类型的。
(1)当无符号类型不小于带符号类型的,那么带符号的运算对象将转换无符号类型。若带符号类型的运算对象是负值,则按照取模后取余的方法进行转换。
(2)当带符号类型大于无符号类型,如果无符号类型的所有值都能存在该带符号类型中,那么无符号类型的运算对象将转换成带符号类型。如果无符号类型的所有值超出了带符号类型的范围,那么带符号类型的运算对象转换成无符号类型。

5、其他隐式类型转换
①数组转换成指针:在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针。
注意:当数组被用作decltype关键字的参数,或作为取地址符(&)、sizeof及typeid等运算符的运算对象时,上述的转换不会发生。

②指针的转换:
(1)常量整数值0或字面值nullptr能转换成任意指针类型;如int *p=nullptr;指针的类型是任意的。

(2)指向任意非常量的指针都可以转成void*;因为void*能存储任意非常量的指针。

(3)指向任意对象的指针能转换成const void*。包括指向常量的指针。

③转换成布尔类型:存在一种从算术类型或指针类型向布尔类型自动转换的机制。如果算数类型或指针类型的值为0,转换成布尔值是false;否则,非0值转换成布尔值是true。

④转换成常量:允许将指向非常量类型的指针转换成指向常量类型的指针,也允许将非常量引用转换成常量引用。

⑤类类型定义的转换:类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换。比如:
(1)需要标准库string类型的地方使用C风格字符串。 //string str=“i am a good man!”
(2)在条件部分读入istream。 //while(cin>>str)

解读条件(cin>>str)的含义
(1)含义:条件(cin>>str)读入cin的内容并将cin作为求值结果。
(2)条件部分本来需要的是一个布尔类型的值,但是这里实际检查的是istream类型的值。
(3)因为IO库定义了从istream类型向布尔类型转换的规则,根据这一规则,cin会自动转换成布尔值。
(4)所得的布尔值由输入流的状态决定。如果最后一次读入成功,转换得到的布尔值是true,相反最后一次读入不成功,转换得到的布尔值是false。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值