您的位置:首页 > 编程语言 > C语言/C++

C++ primer学习之类型转换(1) 隐式转换

2017-02-15 15:32 162 查看

隐式转化

先来看下面这条表达式,它的目的是将ival初始化为6:

int ival=3.541+3; //编译器可能会警告该运算损失了精度


加法的两个运算对象类型不同,3.541的类型是double,3的类型是int。C++语言不会直接将两个不同类型的相加,而是根据类型转换规则设法将运算对象的类型统一后再求值。上述的类型转换时自动执行的,无须程序员介入,有时候甚至不需要程序员了解,因此,我们称之为隐式转换

因为 C++定义了算术类型之间的内置转换以尽可能防止精度损失,所以这里3转换为double型相加得6.451。但是下一步赋值的时候,右操作数进行截断处理,对此精度会有损失,编译器也会给出警告。在函数调用时也会发生隐式类型转换,具体的转换细节可参见本节。

常见隐式转化

算术转换

1.对于bool, char,signed char, unsigned char,short, unsigned short等类型来说,它们都有可能通过整型提升变为int型。如:

a:false提升成了0,true提升了为1

b:

3.14159L+‘a’;


在这个加法运算中,小写字母‘a’是char型的字符常量,它其实能表示一个数字值,到底这个数字值是多少完全依赖于机器上的字符集。当把‘a’ 和一个long double类型的数相加时,char的值首先被提升成int,然后int 类型的值再转化为long double

c:

假如两个类型分别是 unsigned int 和 int,则int类型的运算对象会转换为unsigned int

数组转换为指针

在大多数用到的数组表达式中,数组自动转换为指向数组首元素的指针:

int ia[10]; /*含有10个整数的数组*/
int *ip=ia; /*ia转换成指向数组首元素的指针*/


指针的转换

1.转换为布尔类型

char *cp=get_string();
if(cp) /*... */ //如果cp不为0,则条件为真
while(*cp)  //如果*cp不是空字符,则条件为真


2.转换成常量

int i;
const int &j=i; //非常量转换const int的引用
const int *p=&i; //非常量的地址转换成常量的地址
int &r=i, *q=p;//错误:不允许const转换为非常量


3.类类型的转换:

string s;
while(cin>>s)


这里隐式使用了IO标准库定义的类型转换,返回的是cin,此处将istream类型的值转换为bool类型,意味这要检验流的状态,如果读取成功,返回true,如果失败,比如说读取到文件的末尾,那么转换为bool后为false;循环条件不成立
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: