00:02
看一下。基本数据类型呢,除了自动转换,还有一种叫做强制类型转换,给大家讲一下什么叫强制类型转换呢?先看一下它的概念,将精度高的数据类型转成精度小的数据类型,如果你这样做的话呢。又不希望提示,呃,我们的编译器提示这个warning警告你可以加一个强制转换符小括号。但你加上这个强制转换,不过呢,可能会造成精度的损失或者是溢出,要格外的注意,强制类型转换呢,它的一般格式是前面写上类型的名称,后面写上表达式,这里有一点需要同学们特别的小心,就是这种强制类型转换。转换的操作并不会对原先的操作数进行一个改变,也就是说呃,他不会,他只是把这个强制转换的结果给你返回来,但是并不会对原先这个表达式本身造成任何的影响。
01:09
假设你这个表达式是一个变量,那么这个变量的这个类型并不会发生变化。明白这意思吧,举个例子,一下就明白了。比如说同学们看这有个double,那我直接给他写代码吧。好,我现在呢,再给大家写一个新的案例,好吧,这个呢,我们还是数据类型转换,我写个叫force强制的意思类型。Type转换transfer。好吧,然后呢,我们同样给大家做一个小小演示。我们把这个后缀改成C。在前面加一个include。ST。好的,STDIO。那现在呢,我们写一个主函数。
02:00
给大家演示一下,比如说我现在有个double d double d1。D等于1.234。OK,那现在呢,我有一个整数,我要用第一传递,同学们看,如果我这里不做任何处理,我直接编译它会给我们怎么样啊?他会给我们一个警告,是不是他会说从double到int可能会丢失数据,那么他并因为为什么编译器会这样提示这个错误呢?就是因为他是他认为,他认为你可能是不小心写错了的。他认为你你这句话是不严谨的,因为你把他认为你是想把第一给到这个number,但是你并不希望有损失。所以所以说编译器就认为就说我要提醒你一下哦,小心点,你把第一给到number会有精度损失。那你怎么样可以让他?不提示这个呢,就不提这个warning呢,你可以这样写,你可以这样说,你说我告诉你啊,就是把它括起来,括起来这样一编译呢,编译器就会这样理解,他会认为你作为一个程序员,就是想把这个第一强制转换成int,然后呢付给这个number。
03:19
这句话他就不会再给你一个warning了,那我们来看一下是不是这样子的,来重新生成。可以看到,这时呢,没有任何的warning警告了,你理解这个意思了吧?当然了,嗯,有些同学可能问到说老师,那如果你把它强制转换,这个结果会什么样子呢?来我们看一下。F,我们打出这个number,注意听哈,BYD。找number,那么你原先是1.234,你把穷字转换成过后,这个值是什么呢?我给大家输出来一下。运行。同学们可以看。小数点后面就没有了,输出一个一,当然有同学可能说,诶老师是不是四舍五入啊,比如说我给写个写个九。
04:08
我把一个1.934强制转换成int,并付给number过后,大家觉得number是多少呢?那我们再来看一下。我们仍然来进行一个运行。好,我们看看到底是二呢还是一。运行完过后,我们可以看到这个结果仍然是一,那也就是说这个地方它不管你后面到底有是什么,它并不会应四舍五入,他直接把小数点给你砍掉了,这个能理解吧,所以说注意这个细节,这里。这里注意。这里注意。啊,不是不是进行是蛇。股入,而是直接。直接截断。直接截断小数点。小数后面的部分。这一点请同学们一定要小心。所以说,如果你。
05:00
如果你这样做,你一定要小心,你的意义是什么号,不然的话1.9就变成了一了,那这个可不是。这个数据损失是很大的,第二点我要跟他谈一下,第一有没有变化。那我写个这个F。啊,我写个F,那大家看到第一本身就是你虽然对这个第一进行了强制转换。但是呢,它其实是这个返回的结果付给这个这个number,但是第一本身他仍然仍然还是一个double。你理解我的意思吧,也就是老师说的这句话。这种强制类型转换并不会对这个表达式或者叫操作数本身造成任何影响,那换言之就是说你这个第一第一仍然仍然是double类型。OK,同学们,我们运行一下是不是这样子的好,运行起来我们看到它应该打出的已然是1.934。对吧,后面是不是因为你默认保留小数点六位,后面用三个零给你补充的理解这个意思了吧。
06:05
好,这是我们说的第一个部分,紧接着呢还有强制类型转换,还有几个地方需要给大家强调一下,当这些数据从低从精度高到精度低的时候,就需要强制转换,否则会有一个warning。第二点,强制转换符号只针对最近的操作数有效,往往使用小括号来提升优先级。大家看这有一个案例。同学们看。我我在这有一个有一个,呃,有一个计算式,十乘以3.5。前面用了一个int。前面用了一个int,再加上一个6.50,那么我要告诉大家,就是这个强制转换符只针对他最近的这个数有效,那么我们举个例子,看看这个结果是多少。来,写到这里来。好,我还写到这里啊。
07:00
就是强制。强。强制转换服。转换。只针对。只对只对最近的。最近的这个操作数有效表达式吧,或者呃,这个数有效。有效。啊,如果希望希望针对针对。更多的更多的这个数操作,呃,更多的这个表达式。表达式这个转换使用什么呢?使用小括号即可,那我还是用这个举个例子,比如说现在我有一个int。NUMBER2,然后呢,我这边有个十乘以3.5。十乘以三五点加上我看看这边十怎么写的,同学们,十乘以3.5,六乘以1.5。
08:00
六乘以1.5。好,同学们,如果我在这个地方,如果我在这个地方加了一个int。加了一个int,那么他这个int到底对谁有效呢?这个int到底对谁有效呢?这个int到底作用在什么地方,我们看一下,其实呢,我们把这个结果打出来,大家就一目了然了,我们打出来一下play。好的,NUMBER2等于百分号D。好的,那为了好看呢,我们仍然来一个换行。是不是这样子的,我们输出number。上班大家大家看一下,假如没有这个强制转换。假如没有这个强制转换的话呢,其实它这边相乘应该是。这个应该相相乘应该是。应该是35。是35吧。然后这边呢是九,这边是九。
09:01
所以说这个结果。呃,如果没有int转换的话呢。嗯。我这个例子是不是举的不是特别好啊,我再看看怎么举这个例子比较好一点。啊,比如说我在前面来一个吧,我把这个前面3.5写到前面去,这个乘以十。乘以这个十好,嗯,这样子呢,就比较好看了,注意看。呃,如果我这样写的话呢,它代表什么意思呢?我们来运行一下,先看。跑起来。看一个结果大家觉得是多少?看一下结果大家觉得是多少?大家看到他是39,为什么是39呢。那理论上说,假设没有这个int,是不是应该就是就应该是35。35加上一个九。应该等于切如如果说没有这个转换符,是不是35 35再加上一个九,应该等于多少呢?应该等于44。
10:03
应该等于44,那为什么现在是39呢?是因为这样子一个道理,同学们看他先呢,把这个3.5转成一个int了,也就是说这句话,这个int呢,它只针对这个3.5有效。那换言之就是呃,它如果你这样写的话,它等价于三去乘以一个十,再加上六乘以一个1.5。那这样就是30加上一个9.09.0,其实他最后这个结果呢,其实说实话,他应该是什么呢?它应该是39点。39点。看啊,他应该是39.0,然后39.0付给这个in特过后呢,他认为有精度损失,把后面这个小数点给你砍掉了,所以说你看他这边其实会有会有个提示,是不是double转成int呀。
11:00
就为什么现在这样写这个地方运行,它会告诉你有有一个是double转成音的,就是因为你在这样转换过,其实他认为哈,他认为是39.0给到in特了,因此他有提示信息,结果呢也就39。那如果说你就是希望对整个这个结果进行一个强制转换,你其实应该是这样写的来。给大家写一个NUMBER3。你其实应该是这样写。好,然后呢,把这一大块。包起来。把这一大块包起来。那这样一包起来过后,同学们可以看到。同学们可以看到我把上面注消息啊,同学们。好,这个呢,这个我就改成删了好吧。那这样子,如果我我这样写,我这样写,大家可以看到,这时就不会再有任何的警告了,就不会用warning了,为什么呢?因为他认为你他编辑认为你是把这个得到的结果整体转成一个特,再付给in特,那当然就不会有警告了。
12:04
因为你把整个括起来了吗?那我这个强制转换呢,是针对整个这个预算的结果来进行强制转换的,它就不会再有warning了,明白这个意思吧,那同学们大家看,我再给大家生成一下。好,同学们注意观察是不是现在。呃,是这个原因啊,我们没有把这个关掉再来。再来生成一下。那大家看现在就没有亡了,是不是一次成功啊,如果你上面大家看你把这个上面打开。你把这个上面打开,我把这个再注销一下,你们再来看生成的时候,它其实是有warning的,是不是有个warning呢?Double,大家知道为什么有这个warning吗?就是刚才老师分分析的这个原因,理解了吧,好,现在我们再来分析,如果我这样输出的话,这个结果是多少呢?我们分析一下,它其实是这样子的,先把这个结果算出来是35.0。那理论上它应该是这样子的啊,35.0是个double加上9.0。
13:01
9.0,然后这个这个结果呢,应该等于就是我们说44.0。然后把这个44.0呢,强转成int给到它,所以说最后这个结果应该是44。明明白这个原因了吧,也说这边输出的话呢,这边我们的NUMBER3就应该等于44,而且不会有任何警告,不会有警告,来,我们先来生成一下,看看是不是有是不是没有警告,刚才已经测试过了,然后再运行。好,同学们可以看到这时是不是是不是啊。对不对,好同学们这1.1定要注意,就是老师说的哪一点呢,就是说强制转换符只针对最近的操作数有效,好,我们再来看一道题。同学们看这道题,你们觉得这道题是否会通过编译?这儿有一个C。这有一个int,这一个float,把这三者相加付给double,我问大家,我问大家先问大家一个问题,C加I加D这个结果的数据类型是什么?
14:04
能回答我吗?也就是说C加I加D,它的类型是什么呢?它的类型其实是float。它的类型是负责的,那我把float给到一个double当然没问题,因此这样提示,这样给的话,它会产生一个自动转换。因此它不会有任何错误,就是OK的,那我们来试一下,看看这段代码这样做是不是这样子的好。同学们,我把这个先注销一下啊。那么我写一个小练习。跟上我的思路。Ex exer c,这是一个练习。练习零一吧,后面可能我们还有别的小练习。同样的道理了。我把这一个练习exercise。的。后缀改成C。因为如果我不改成C4CPP的话呢,他用的是那个C加加的编译器了。
15:02
Include。STDSTDIO。好,紧接着我们继续来玩。我把刚才这段代码呢给同学们整过来。转过来。啊,那同学们看到我先格式化一下。同学们,现在看,我们来生成一下,你会看到没有任何错误提示。没有任何错误提示,你看是不是这样子的,没有任何错误吧,没有提示任何wall什么都一切OK,因为这个地方就是刚才老师所说的,其实它是float到这个double,那我改一下。我改一下,看看同学们能能否理解,如果我改一下这个代码会提示什么,我找一个同学说哈。大家看,如果我把这个改成差。我把这个改成请问,请问这个地方会提示什么信息?会提示什么,一定会产生一个wall力,因为你整个这个结果是一个float,它会提示什么呢?啊,他说告诉你啊,你把一个float给他差了,一定是一个警告。
16:05
警告当然无所谓,警告本身也可以运行,只要不是A没问题,警告本身可以运行的,但是警我们在真正只做开发的,最好连警告都不要有。再说一遍啊,警告其实可以运行的,但是A是跑不起来的,但是警告我们尽量不要有,这个时候同学们看我在编译。我在生成,你会发现呢,会有一个warning。啊,他会说成功了,失败零个,但是有个wall,这个wall是不是告诉float到char。那我再问大家一个问题,再问大家一个问题,如果说如我说如果啊,我我在这边再加一个double,第二等于1.0。然后呢,我在屁股后边再加一个。第二,请问这个警告应该是什么?就说我C加I加D再加D2再加加,那么这个时候警告应该是什么信息还是float到吗?
17:00
如果这样子的话,他的警告信息就变成了告诉你啊,小心点,有个double到圈,为什么是double到圈了?因为我们刚才讲过一个最基本的原则,就是当我们有多个数相加或者相运算的时候,但不一定是加,可能乘除都是一样哈,那么它就会把所有这个结果提升到。最高这个级别,因此如果你这边有个第二。第20个double,他就会告诉你哒,警告什么呢?他会发出这样一个警告,他说警告你啊。他要警告你什么呢?Double到差会有进度损失是不是样子?我们再来给大家深深一下。好同学看,的确警告变了。是不是好,通过这个小案例呢,我们可以更加深入的认识前面的一些。就是转换的规则,好的同学们,那现在呢,我们就把刚才讲的这个强制转换的这些内容给大家梳理一下,大家理解一下。
18:01
前面我们讲的是什么呀?前面我们讲的是强制转化的内容。立到这里来。那强制转换老师讲了哪些内容呢?捋一捋,首先我们做了一些基本的介绍,我先做了一个介绍,是不是我说诶。什么叫强制转换?强制转换就是说当我们将精度高的这种数据类型转成精度低的或者精度小的呢?需要加上一个强制转换符小括号。这是同学们注意它的格式,老师也说了一下,格式就是类型名称加后面的一个表达式或者操作数,那么这个表达式就是这个就是就算是一个表达式。就是同学们看到刚才看到这一个。这个就是一个表达式。是不是,当然有些同学说老师后面是一个变量,是不是,是不是也算一个表达式呢?也可以算。表达式就是任何有值的东西就是表达式,我这儿强调一下何为表达式,说明一下哈。
19:06
什么叫表达式?什么是表达式?什么是表达式?表达式就是任何有值的,有值的都可以叫。都可以称为。称为表达式。表达式,比如你这个一加二是表达式啊,当然说老师我给了一个,呃,给了一个二,就是有一个int number。二那么这个number能不能当成一个表达式用来也可以,因为它只要是有有一个值就行啊,有一个值就行,比如说刚才我们讲的,呃,比如说刚才我们这个力。第二这个第一这个也可以看成一个表达式,只要有值,我们就认为是个表达式。好的,这是刚才讲的这一块。呃,强制转,诶,我把这句话也拿过来好。什么是表达式这句话的解释呢?也给同学们放到笔记里面去。
20:04
大家以后可以看,那紧接着我们又讲了什么呀,案例的一个演示,还记得吧,那案例演示呢。这个案例演示其实我是在这写的false是不是在这啊,我把这个打开吧,对这边打,这边不打开它,它看起来不舒服。好,我把这边写的一个小案例放到我们笔记来,紧接着呢,我们是不是又讲了强制转换的一些细节问题,这边讲了一下细节。好,我把细节呢也给同学们捋到这儿。强制转换需要同学们注意的细节呢?主要有这么两点。对不对?主要有这么两点好捋一捋。就是我们在进行这个转换的时候呢,需要强制转换,第二个强制转换符号只针对最近的操作数有效。如果说你要针对后面的所有效需要用小括号提升它的优先级。
21:01
就是把它包起来。这有个案例。案例演示,那么案例演示呢,其实是在这里。是不是是不是都在这一块啊,我们把这个案例一起放这哈。就是上面这个案例,其实已经已经提到这个地方了,就这这个这个案例在上面,我这写一个案例先上。案例演示,看上面上面的就OK。是不是上就是这个强度转换的,不在这写的吗?看下面就行了。最后呢,我们是不是还出了一个题啊,就是问大家这一个练习题,就基基本数据类型转换的一个练习题,我们也捋到这。练习题。就一个小练习,这个小练习呢,我们问大家这个是否能通过编译,并且问会提示什么信息,就这方提示什么信息呢?就是如果说你这里没有发生变化,它会提示你,呃,就如果是这样子是OK的。这样写是OK的,但如果你是这样写的,再看一个案例。
22:01
下面的还有一个案例,还有一个案例就是说如果说你这发生变化了,比如说像刚才老师这样写的CE。如果你用一个char来接收这个结果。那么。就会根据这个实际情况提额,比如说你这是呃,这一张他就会我就把这个拿掉了。呃,这个地方如果你C加I加D加D,它会警告double。转成char会有数据损失。也就是说它会根据你这边的这个结果来提示,如果你整个这个结果哈,是一个。呃,高精度的,而这边是个低精度的,你又没有强制转换,他就会给警告。明白这个意思了吧,就是小型面试官,就是我们在考试或者说在做开发的时候要注意这个细节,因为警告就意味着有可能有精度损失,结果这个结果跟你想的不一样,就麻烦了。那我把这个案例呢,也给同学们板述到这里。
23:02
加深一个认识。放这就可以了。加深一个认识,好这上面一个案例,下面一个案例,好同学们,那关于我们这一块基本数据类型的强制转换,还有自动转换,我们就给大家说到这里。
我来说两句