通读《C++ primer plus》— C++中的5种数据类型转换方式

1、始化和赋值时转换

比如
int a=1;
long b=2147483647;
a=b;
上面的代码并不会有问题,。然而将a更改为float类型,将会出现错误。
需要注意的一种情况是:
把0赋值给bool类型变量,会被转换成False,非零的会被转换成True。
把字符串赋值给bool,是不可以。
但是反向可以,比如把False赋值给字符串变量,得到的是:"\u0000"
总之,尽量不要跨类型赋值,否则错误是很难避免的。

2、{}形式的转换

书中给的例子是:char c {66};
此行代码执行以后,C的数据是B。这个不难理解,在ASCII表中,十进制数据66,对应的正是字母B。
在这里插入图片描述
但是如果我们给10000这样的数据,超出了表的范围,将会报错。
在这里插入图片描述
我们得到了一个关于字符串宽度的报错。

3、表达式中的转换

先看如下代码:
short a=100;
short b=200;
short c=a+b;
表面上看,是short类型相加,得到了一个short类型的C,其实并不然。
编译器在实际加的过程中,要把其变成int类型相加,然后再转换成short类型。
至于它为什么要这样做,可以看一下C++11的校验表。
(1) 如果有一个操作数的类型是long double,则将另一个操作数转换为long double;
(2) 否则,如果有一个操作数的类型是double,则将另一个操作数转换为double;
(3) 否则,如果有一个操作数的类型是float,则将另一个操作数转换为float;
(4) 否则,说明操作数都为整型,因此执行整型提升;
(5) 在此情况下,如果两个操作数都是有符号或者无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型;
(6) 如果一个操作数为有符号的,另一个操作数为无符号的,且无符号的操作数比有符号的操作数高,则将有符号的类型转换为无符号操作数所属的类型;
(7) 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型;
(8) 否则,将两个操作数都转换为有符号类型的无符号版本。

读起来很绕,手打出来的时候也是懵懵的,但是仔细阅读不难发现,按照我们正常思维理解就行了,不一定背下来。

4、传递参数时候的转换

这个似乎没必要多说,比如把一个int类型的10,传递给一个函数,这个函数的接收类型是浮点型。和赋值转换并没有什么区别。

5、强制类型转换

两种转换方式:
(typename) value 这种是C语言的方式;
typename (value)这中是C++语言的方式。

如:
auto a=int (1.23);
auto b=(int) 1.23;
我始终auto是为了表明我不确定是否转换成功,以此输出变量的类型.
P.S.:typeid (b).name()可以获取变量b的类型
此外,需要记住的是C++引入的四个强制转换运算符,非常重要。
书中此处只是讲述了static_cast,同样,也只写这个的用法。
static_cast (value):把value转换为typename类型,如
double a=1.23;
auto b= static_cast (a);
//编程软件为Qt,qDebug()可以用别的输出代替
qDebug()< qDebug()< qDebug()< 输出依次是1.23、1、i
说明成功把1.23转换成了int类型。
而且软件也提醒我们转换过程丢失了精度。

在这里插入图片描述

你可能感兴趣的:(C++)