00:00
那么现在我们有必要给同学们来比较一下cost和这两种方式的区别。我这里呢,一共跟大家整理了六点不一样的地方。有些地方比较简单,我说一下就可以了,有些地方呢,相对不太好理解,我给大家举案例演示,首先看第一个区别,Cos的定义,常常数或者叫常量式。常量好,叫常量史。他会干什么呢?他会带这个类型,而B呢,不用带,大家看这边代码是不是这样子的,你看我这里cost是不是这边是有数据类型的。而我们DeFine定义的时候呢,同学们可以看到。这个地方的时候,后面并没有带数据类型,好,这是第一点需要同学们注意的,第二点呢,To它在编译运行的时候才会生效,也就是说在编译运行的时候它才会起作用,而我们这个B呢,它是在编译的预处理阶段。
01:07
就起作用了,也就是说我们这个程序,我们这个程序在预处理的时候就已经开始生效了。就有点类似于这样的一种,这是我们的代码,我们代码呢有一个编译的过程。有个编译,就是本身是有个编译,对不对,以前我们讲过这有个编译。编译。那么在这个C语言里面呢,在编译之前,其实还有一个过程,我们没有在前面没有提到,在编译之前,就是这是我们的源码,比如这是我们点C码,它通过这个编译器,它通过这个编译器得到了我们的这一个。呃,就是object文件,还有印象不OB节文件,那么实际上呢,在C语言里边呢,在编译之前呢,在编译之前还有一个过程叫做预编译。
02:00
还有一个过程叫做预,预先的预哈。预编译就是我们所说的这个预处理,预处理在这个预处理之前呢,它就已经开始生效了,就是低办,明白意思就是它可以叫做预处理,或者叫做预编译。预处理。他在这个预处理之前,预就是预先的意思嘛,他在预处理之前,这个程序就会去看一下地办,他要进行一个替换。啊,它其实在这里面起只是一个替换的作用,明白这个意思了吧?好,第三点我们来看一下就可以了,DEF范呢,只是简单的一个替换,没有类型检查,简单的字符串替换容易导致边界效应,那这一点我要给大家举个例子了,就说第三一句话呢,相对不太好理解,而且呢。也是我们盘和cons的一个重大区别,因此我有必要给同学们怎么样啊举例说明,那同学们打开这里,我该说一下它的区别。
03:01
好老规矩,我们把前面这一个。文件先注销下,我们写一个案例。现在呢,我们取取的这个细节吧,我们叫做。怎么取个名字呢?叫cast Vs和谁啊?迪梵这样子是不是大家一看就明白了?这是他的第一个案例。好,我们走一走,好,走一走。看一下它的区别到底在哪里,因为这是一个我们在笔试或者是考试的过程中呢,容易出现的一个提问。好,我先在这儿引入它,然后我写一个VO的。主方法。那大家看我的代码,你们一看就明白了,首先我这么写一个D。然后呢,我写个A,我写个A,写个一,再来第一份。再写一个B。我写个A加三。A,这样子咱们写个A加三。
04:01
OK,然后呢,再来第份。再写一个什么呢?CC,我写个A除以BA除以BA再乘以三,写完了,写完以后我们来看一下这效果哈,比如说我这样写,大家看,大家会觉得它会出现一个什么结果,Print f。然后呢,我输出一下C,我说C。等于。百分号D。然后呢,我在这儿把这个C写上。这地方为了好看呢,我来个get char,请同学们思考。请同学们思考。你们认为。这个C是多少?问。问题是?为什么呢?C等于多少?有些同学可能会这样想,我觉得有些同学可能会这样想,说老师这个很简单吗?这个不是一吗?那这个是一的话,这个不就是四吗?可能有同学会这么想啊,他说老师这个B就应该等于四。
05:01
是不是,然后这个B等于四的话呢,有同学同学就推出来说,哦,这个C是A除以B再乘以三,那就算呗,那一除以四乘以三。对吧,大部分同学可能会这么去想,那一除以四,一除以四的话。大家想想这个结果是多少?是不是零点几,那大家可能认为是零呢,实际上呢,这个结果应该怎么去看呢?这样我们这样推是不对的哈,这样推是不对的,他其实应该这么去推。怎么推呢,他这样子的,我们刚才讲到讲到哈,就是嗯与我我们这写一下这个分析过程,最新分析过程。就是饭,注意听这句话。只就是就是一个简单的替换。替换。替换,因此呢,它其实是这样子的,它不是像我们刚才那样分析的过程,它其实是这样子的,那相当于这个C就等于什么呢。
06:04
所以说这句话就是这个C啊,到最后运行的时候,这个C其实是什么呢?其实是这样子的。他这样写。呃,就是。呃,就这样子的啊一呃,它是这样子的,你这个A就到这这A那就是CN,它就是A除以。这个B是A加三。并不是像我们想象的一个小括号的感觉。再乘以三。它实际上是这样一个,就是说A除以A除以A再加三再乘以三,那当然AA除以A那相等于一了。是不是等于一呀,一一再加一个后面这个,那其实这个应该是一,像我们那样想的哈,那这个A不是一吗?那相当于相当于说是一除以一,再加上三乘以三。
07:02
等于多少呢?等于一加上一个九等于十,所以它并不是像我们刚才想象的,如果是安才刚才想的话,那你这个是1B就应该是四,那就是一除以四乘以三,那肯定不一样的结果了。对不对?所以说这个地方一定要明白,它只是一个简单的替换,并没有像我们想象的有括号,因此我们这提出的说它简单的字符串替换容易导致边界效应,什么叫边界效应呢?就是因为你你这个地方。把它当成一个整体了,其实人家没有当一个整体就出现边际效应,那么运行一下看是不是等于十。运行起来我们看效果,同学们看。这个结果跟我们想的应该是一样的,诶运行起来没有是不是十啊,并不是像我们想象的,如果如果真的是按刚才那样写,就是一除以四再乘以三,这个这个不绝对不可以等于十嘛。
08:00
那问题来了,说老师,那我假设我我假设说说老师,那假如我就是希望能够像刚才那那个效果,就是把它看成一个整体,怎么办呢?那你要这么去写了,你得把这个刮起来。括起来。就可以,如果你括起来那就不一样了,如果你括起来的话呢,它在替换的时候注意听这句话啊,如果你这边是写的B。等于B定义成的是一个这么一个玩意儿。这么一个玩意儿,所以说如果这样的话,他在那,那你如果是这样的话,C就变成这样子了。C其实按我们那个退化就是A。这个这个写一个一个除法,然后呢,把它包起来。那这样子的话效果就不一样,那就是一除以。A,那就是一除以A加三。啊,一加三。然后呢,再乘以一个三。
09:03
然后这样子就是相当于说是变成了一除以几呢?一除以四再乘以三。再乘以三,那这个结果就应该等于几了,那同学们想,一除以四。这个是不是零点几了,那在因为它这个是是要取取取一个这个这个0.25嘛,我们算是0.25,那0.25再乘以一个三,这个结果我们可以看一下是什么,好吧,我们运行一下肯定不等于十了,肯定不等于十,我们运行之。运用起来。跑起来。抛解过后呢,我们可以看到变成零了,因为你是按。整数来取的是不是。对,那也就是说我按这个小数来取2F,我们看看这个时候结果是什么,好吧,我们运行一下。印象。诶,这个刚才是不是没有关闭啊,没有关闭再运行一下同学们。
10:02
再运行一下。好的,那看这个结果是0.0,为什么是0.0呢?同学们是为什么是0.0,是因为你在这个一除以四的时候,因为你在一除以四的时候,这个已经给你变成一个零了。呃,一除以四它已经变成零,因为零点几它取一个什么样,它整个取一个就是整数部分,那你这个就已经变成零了,当然是这样子的。明白这个意思吧,也就是说。再说的再直接一点,大家可能不不太明白为什么是这个结果啊,你可以这样看吗?我给大家,我给大家演示一下,比方说我这么写大家就明白了,比如我用一个变量来接收,我用个double来接收哈,我用个double来接收,第一等于这个值。那你看一除以四再乘以三。一除以四再等于三,那这个结果应该是多少呢?我们来给大家跑一下。If。走起来。
11:01
走起来,那现在走起来过后呢,走起来过后我们把这个第一给大家打出来,大家一看就知道了哈,2F。第一,好不好,是不是这样子就可以看到效果了呀?为了好看,我们换一行。换一行运行一下,同学们,咱们运行一下。看这个D等于多少呢?诶是不是上面又没关闭,不好意思再来跑一个。运行。运行。好大看是不是还是0.0,那为什么是0.0,不是我们想象的这个呢?大家可能会想,诶,它不对呀,它应该是一除以四,不是0.25吗。再乘以一个三吗?不是这样子的,因为你大家想啊,这个一除以四它是整数相除,因为它是整数相除,它整数相除,你这个因为就说我们不是讲过吗,一除以四它整个这个结果是整数除以整数,那如果是整数除以整数的话呢,它本身确实是0.25,但是因为这个结果要保留整数,是不是相当于就把后面这个截断了呀。
12:10
变成零了,再乘以三,那零乘以三当然等于0.0了,那有些同学说老师那假如假如我就是希望能够保留小数点怎么办呢?那可以是不是提升它的精度啊,你写个1.0除以四就可以了,为什么?因为1.0除以四整个这个过程中,整个这个运算过中。Float是精度最大的,那整个这个结果呢,就会提升到float,而刚才你一除以四,它的精度最大的也是这个int的最后结果也是个int。所以说你如果要保留小数点,其实你这地方必须有一个小数来参与运算,才能提升我们这个精度。对不对,好,大家看这样子,肯定这个结果就是了,因为1.0除以四,1.0除以四,那就是0.25。为什么?因为你本身这个结果。
13:00
1.0就是double吗?那当然我就这这个结构就保留一个double类型,再乘以一个三啊,这个就没问题啊,这个肯定就等于我们所说的0.0.75,能理解吗?同学们。好注意听啊,注意运行一下,再给大家看一下,现在应该是0.75了,就是第一是0.75,我给他解释一下为什么。看效果,看效果,诶是不是0.75啊。是不是0.75,如果你原先这样说,那就是零,好了,同学们我就讲到这里哈,我就讲到第,这是我们讲的第几个小细节啊第。第三个说完了,第四一个,呃,抗的呢,它可以进行调试,DEF盘不能进行调试,为什么呢?因为我们这个盘是在编译之前就预处理了,因此它没办法调试。最后一个。呃,这边细节还挺多的,这后面第五一个和第六一个呢,内容也比较多,我们放在下一个章节讲,这样大家听起来会比较轻松,好,第五点和第六点呢,它涉及的知识点还比较多,我们放在下一个视频为同学们讲解。
我来说两句