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;循环条件不成立
相关文章推荐
- C++ Primer 学习笔记 — 隐式类类型转换
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- C++ Primer 学习笔记与思考_10 类型转换易错处大总结
- c++ primer(第五版)学习笔记及习题答案代码版(第十四章)重载运算与类型转换
- C++ Primer学习总结 第14章 操作重载与类型转换
- C++ Primer 学习笔记_18_表达式(续2) --new/delete表达式与类型转换
- 隐式类型转换(C++学习)
- Scala学习笔记--隐式类型和隐式转换
- 数据类型回顾——数据类型转换(显式和隐式)—JS学习笔记2015-6-3(第47天)
- scala学习手记35 - 隐式类型转换
- [C++再学习系列] 隐式类型转换与转换操作符
- 隐式类型转换(C++学习)
- c++ primer 第五版学习笔记-第二章-类型转换
- [C++再学习系列] 隐式类型转换与转换操作符operator T
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- 隐式类型转换(C++学习)
- 学习Scala:Map初始化过程详解及隐式类型转换
- js之数据类型-隐式转换-类型检测 学习总结