00:00
那么各位同学,学到现在,你们有没有发现带参数的宏定义跟函数调用其实有些相似的地方,但是也有一些不相同的地方,我们来做一个比较。其实这两者的区别呢,还是非常大的,我们来说一下带参宏定义和函数的区别,宏展开仅仅是字符串的替换,不会对表达式本身进行计算,宏在编译之前就被处理掉了,因此它没有机会参与编译,也不会占用内存。函数是一段可以重复执行的代码,会被编译,会给它分配内存,也就是说它会有一个代码区来存放我们的函数,每次调用函数呢,都是执行这块内存的代码。那这样讲,如果大家可能还是没有感受,诶,到底有什么区别,这样子我跟大家呢,举一个例子,要求用函数计算平方值,用宏计算平方值,我写了一段代码,大家来看这段代码他们分别输出什么结果,大家一目而了然,那这样子我们我们来比较一下哈,各位同学我们来比较一下。
01:06
这个一比较,你一下子就能看到它们的区别。来走一个。走一个,我们写个名字吧,叫做function。Function对VS谁呢?对我们的。大家一看就明白是什么区别了。老规矩,把这个C换掉。好,我把这个呢拿过来,我们先看一下这段代码,当然为了演示这个效果呢,我们需要include std。大家看现在。现在这段这段代码啊,这里面我还要还要引一个东西。Include std。因为这里有个system语句对吧。大家看,这是一个函数。这是一个函数,在这里呢,同学们看我有个while语句,这while语句呢,我求的是,我得到的是,呃,这个I加加,然后去调这个函数,这个函数是不是实际上就是求。
02:08
求Y的Y的一个平方,大家看出来是不是求Y的一个平方啊?是不是Y的平方,那大家看,呃,我们简单分析一下,第一次Y的第一次第一次。第一次。第一次是不是,呃,I小于I小于一,我们我们这分析一下它的内存变化。I。第一次进来是一。然后I小于五成立,成立过后呢,它这边。他这边就这样说的。对,它怎么求的呢?它是SQSQ,那么I加加,注意这个加加是后加加,对不对,它是后加加,为什么我这写个I减一。好,这个我不知道这为什么这样写的啊啊,换了就行了,我们重新来分析。
03:02
重新来分析。第一次I进来呢,是等于一的一,因为这个是后加加,所以它一定先去运算再加他先把这个。先把这个I传进去了,先把这个I传给这个YY乘以Y,那第一就是第一次就是等于一,这个结果一完了过后,一完了过后,这个I呢,就变成二了。变成二过后,进来以后又求出二的平方,应该就等于四。好,试完了等于339999完了就是四四的平方是十六十六,完了过后呢,是五五就是25,不是25,完了过后就是六六不再小于等于五出去了应该是一四九十六二十五,我们看对不对,我们运行一下,各位朋友我们运行一下,看看是不是跟我们分析的是否相同哈。对,我们看看运行的结果。
04:01
那么运行的结果呢,我们发现是一四,96 25,跟我们说的一模一样。跟我说的一模一样,那为什么我我这边要减一个一呢?大家现在明白了吧。你看现在变成了二的平方,为什么呢?因为我们这个语句啊,它是先执行的这边。我们语句是先执行的这个再输,再写这个I的,所以说你这个加完了过后呢,其实本身求的是一的平方。本身这第一次进来是求的一的这个平方,但是这个一你后加加完了过后这个输出I的时候,它变成二了,因此我在这为了能够给它匹配上是I减一,就这么来的,明白了吧,现在再看一下就正确了,因为这个ii加加是,呃,是后加加,我在运行你们就看到这个结果跟我们想的一样了。哎,现在就不会在出现二的平方等于一了。你看这样子的结果就应该是跟我们想象的一样,就一的平方等于多少。
05:02
对,二的平方等于四,三的平方对吧,四的平方五的平方这才是对的,因为我们是代码是先执行的它。先指定它,所以说你这个ii传进去的是一算的一的平方,但是I处理完了过后,I加加了,所以说你这个地方要对应输出它的值应该是I减一才对。好,这个就说完了,那现在呢。我们重点来看一下这一个会怎么样呢?假设我们再有一段代码是这样写的,根据老师思路来展示一下啊。我就写在下边。我就写在下边儿。那写在下边呢,我们把这个I呀,重新置一下就可以了,比如说I重新设一个一。对,然后呢,这边这边我们先注销哈,这是我自己写的注释,待会再用。这个地方我们也去掉。去掉。那然后呢,呃,同学们,我们干脆这样子,把上面这个先注销一下。
06:00
这样子看起来会更清晰一点。同时呢,我给大家把这一个宏定义拿呃,带参的宏定义拿过来给他用一下。这个大家能看懂哈。代代餐的代餐这个红定义跟它名字相同,所以说我也想把它注销一下好不好?先注销一下。大家看这是一个代餐,红DY这边我也小括号括起来防止,呃,它的这个问题前面不是讲过吗?我们在求数的平方或者是运算的时候,最好把它的行参用小括号括起来。那这个时候我问大家,此时此刻。我们用I小于等于五也去求它的平方,会有什么结果呢?首先我们分析一下,同学们,我们分析一下。就是我因为这是一个宏定义,带参宏定义,它展开以后,就这个是一个宏调用。它是一个红调用的一个一个代码,那么它展开过后它是什么样子的呢?各位同学能告诉老师吗?它展开过后,其实它是这个东西。
07:10
是不是它是这个,它展开以后其实这个,而这里面这个I呢,也被替换成I加加了。因为我们知道要用时参去替换行参,大家看他这边其实是进行了两次爱加加。那现在我们来分析一下,此时此刻它的结果应该是什么样的呢?好,来,根据老师思路来走向I走起来I,那么ID一次是一依旧进来了。一进来过后呢,他先是爱加加。哀加加,但是这个哀加加呢,它是后加加。所以说这个时候,其实这个参与运算的仍然是一。对。这个地方又加加了,但是因为它也是后加加,所以说它参与运算的仍然还是一,因为是一嘛,但是这个做完了以后,我告诉大家这个I可是加了两次的啊,也就是说这个地方这个I其实已经变成了。
08:04
几呢?变成了三了。能理解吧,也就是说他第一次输出了一个一,但是这个输出了一个一,但是R1呢,其实已经变成三了。好,变成三,三小于等于五是成立的,所以它再次进来,但这次进来的时候是算的三的平方,所以说这个是九,但是这次处理完了过后呢,I也加了两次,所以这个I呢就变成五了,能理解不?好,变成五以后,变成五以后,它仍然还会进来一次,还会进来一次,所以说会求到25。然后呢,这边I就变成七了,因为它会加加两次,所以说它最后这这个结果其实是。进来三次,分别得到的是一九二十五,所以说最后我们分析出来,它实际上是循环几次呢,进入。进入循环。这个三次。三次得到的,得到的,得到的是什么呢?是一乘以一的平方等于当然等于一了,当然是三乘以三的平方当然等于九了。
09:12
对,还有一个是五乘以五的平方,当然等于25了。所以最后这个结果其实是这样子的,如果你想看到这个输出,那你这个呢,应该减二,为什么减二呢?因为你这个是加,加你加了两次,但是要减二才能看到它本身这个值,你求一的平方的时候,其实这个I已经变成三了,所以你要这样看来,我们看是不是这样子的啊,运行起来。运气了,我们看这个结果跟老师分析的是否一样。愿意一起来看下效果。我们可以看到这个跟老师分析的完全一样,看到没有。所以大家通过这个案例就能够体会到什么呢?我们这一个呃函数呃和宏定义调用其实是有本质区别的。函数的调用呢,它是把这个作为一个整体来调用的,而这个宏宏调用其实它就是个替换,替换完了过后再把它做成一个代码来运行的,那显然这个感觉就不一样了。
10:10
明白这个意思了吧?好的同学们,那关于这个题呢,我们就聊到这里聊这里好这个地方我们说的啊,这盘输出的结果应该是啊一。啊,是。还有九,还有16,还有一个25,而这边相当于是计算得到了135的平方,这是有区别的。这是有区别的,好,这是我们讲的带参宏定义和函数的区别,就说到这里还是比较重要哈,就是一定要把它搞清楚,小心我们在进行考试的时候,或者是。呃,做开发的时候,这个细节没有注意到。各位,我把这里面代码给它整理到这。那这里面我们提到三点的区别。然后呢,我们给了一个非常经典的案例,来阐述他们的区别,是不是好,我说到这里了。
11:05
哪里呢?我们先举的第一个案例。诶,在这。举的第一个案例对不对?哎,那我干脆就从这儿取取过来就行了,好吧。这边就取过来,这是第一个案例。放到这里吧。插入一个小表格。好,这是第一个案例,紧接着呢,我们又举了第二一个案例。第二杆例是在这里。第二个案例在这里,那这里我做一点说明,就是这个地方地方替换完了过后,它是长什么样子的,我把我的这个说注释给各位朋友板书过来在这。是不是,哎,它是这样子的。对诶怎么跑到上面去了下面,然后他这个替换完了过后,这个红替换呢,这个红替换完了后,他是这样这个样子的。是不是你要把这个本质找到,你就知道为什么它输出的是三次,而不是五次,因为它展开过后,其实它是加了两次,所以说他最终他是进行了135的平方。
12:11
而不是像我想的A2345。各位关于带参宏定义和函数的区别,就给同学们讲解到这里。
我来说两句