00:00
Hello,大家好,我是上硅谷加外意学科的讲师柴林燕,今天呢,我们来分享一道面试题,这是一道关于自增变量的这样的一个面试题,它在面试当中是一个高频出现的考点。大家可以暂停一下视频,然后呢,自己推导一下运行的结果是什么样子的。好,我们一起来看一下病情,结果是什么样子的啊。好,答案呢,是I等于四,J等于一,K等于11,那么你的结果对不对呢?如果对的,我们接下来啊,一起看一下咱们的分析过程是不是一样的,如果不对的,那么更要听一听咱们哪块地方理解的不太对呀。我们一行一行来分析一下它的这个执行过程啊。先来看第一行,I等于I加加。
01:01
那么它是怎么走的呢?首先需要把这个啊等号右边的先算啊,负值操作是最后算的,所以呢,我们这个I加加要先算,那I加加,因为加加在后面,那我们知道肯定是要这个加加要先后算啊,先把这个I的值呢,压到我们的站里面,我们说这个运算的过程啊,是要把这个值压到操作数站的当中,我们来去运算的,那么把这个一呢,就压到操作数站里面了。此时I加加又开始算了啊,自增,那么自增呢,就会导致我们I变量呢,从一变成了二。那么这个时候是不是就完事了呢?不是这样的,我们刚才算的是整个右边的结果,那么其实我们这个复值操作还没有算,因此我们需要把操作数这的这个结果啊,再次复制给I变量,因此呢,它会有这样的一个操作。大家会发现这个二被覆盖掉了,因此I还是保持一,也就I是曾经变为二的啊,那么我们最终变成一了。
02:05
那么这个过程对吧,我们是可以看一下我们的自检码啊,这个它的指令的,我们来open with file啊,这个class file就是我们的自检码的一个查看器吧,啊那么这里面呢,有这样的一些指令。好,那么这个当中我们呢,哎,把这个呢拉过来啊,大家呢,可能对比下我们的代码来看一下。其实这个里面啊,第一和第二句这个这两个指令其实是对应什么,对应的是这个。这个cost就相当于是一啊这个常量,常量或者叫常数,把一常数值给这个。压到这个站里面了,那这个我们没有没有分析这个过程啊,那么大家应都很清楚,那么这块呢,STORE1,那就把这个呃一呢复制给了I啊,这个变量也就是这两行,相当于是这一句,我们刚才分析的是这几行啊,这几行,那么这几行是第一,你看它会把这个I变量的值嘛,漏就加载到我们那个啥里面当中一,然后呢,I自增,对这个I变成这个二自增,那么也就是刚才这个地方的二,然后最后呢,它有个stop stop呢就把这个呢又放回去,变成这样过程啊,这是我们的指定到这。
03:26
放在这儿。好,那我们下面来看一下,下一句啊,相信大家呢,这个很清楚了,下一句就更简单了。I加加是吧?这个G是等于加加,那么结束把刚才的I呢改成了J的过程是一样的,那么I还是要先压到这个里面去一,那么I在自增变成二。但这回因为它最后的负值超度是给了G,因此这个一要传哪去了呢?全转来了,所以呢,它就变成了是这样子。而最后的这个I呢,值呢就没有被覆盖掉啊,还是保持二,所以到这一步以后,我们的G呢,等于一还等于二,那么我们同样可以看一下我们的自己码,这里刚才来是到这一步,接下来还是一样的啊,你看把这个一对吧,加载过来,然后呢S自增,然后呢,这个STORE2 store2上面就传给了这个第二个变量啊,相当于是它。
04:23
传给他了,那么这个时候呢,就是刚才的三条语句,那么接下来我们看一下下一步是吧,哎,下一步呢,比较复杂一点,它是一个又混合运算,又涉及到自增,那么看看啊,它是怎么算的,还是这个规则啊,右边整个限速,那么右边呢,先遇到I,那么I的值要先压入站,有的人说那不是应该先上乘除嘛,对,但是我们这个当中啊,虽然为线,但是他们这个值的这个压路超作数站的过程是先从I开始的,I的值先会压到这个里面。要过来。
05:00
但是我们呢,哎,算后面的,算后面的,那么但是这个当中啊,我们呢,加加I也得去加载过来对吧,那么加载过来它是I加加在前对吧?哎,这个加加在前,那么我们呢,会先把I变成了三转变化,也就这一步啊,弄完以后他要把这个值呢,哎给压到这里面去,也就三要压过来了,你看一下下一步啊,就这样子。然后呢,遇到了这个啊爱加加,爱加加呢先啊这个把爱的值加载过来,那么这个时候呢,是三,然后哎,还是要自动自动这个接着算,那么这个时候呢,大家看到这个地方要变化,变成了我们的四。自增好,这个时候我们因为这两个数已经压好了,我们要把这个呢先算过来啊,那么三乘以三。这个九怎么办呢?他没办法复制给任何一个边量,只能重新压回这个站里面,因为它最终的结果还没运算完,还是在这个,就像那个临时结果,那么最后呢,我们算它跟这部分临时结果的一个加法,那么九加二。
06:10
再复制给谁呢?复制给我们的10K 11复制我们的K。是让你过程。那么我们来看一下字节码,它是不是这样子啊。那么刚才呢,是分析到啊,这个第11步对吧,那接下来这个把我们的I的值对吧。弄过来,然后呢,再算自增。然后呢,再把自增以后的结果呢,I呢又压到这里面,然后这个呢是先漏的I,然后I再自增,最后呢,放在这个乘冒来是吧,然后呢再是加法,最后呢全给这个K。啊,复制等于K,所以这个呢,是我们有这个对应的指令的,那么我们呢,呃,自增啊,这个相关的大家就要注意了啊,就是我们。加大在前为先,自增后把这个值压进去,加在在后是把这个纸先压到操作箱里面,然后再自增。
07:06
那么我们来总结一下刚才的这个,呃,几点,第一你要注意复制操作,最后计算。那么从等号右边来说啊,右边等号右边的从左到右依次把这个值呢,就是它这个叫漏掉了是吧?哎,那么压入我们的操纵数占中。但压进去啊,那么并不是说从德月往上运算,实际先算呢,也要看运算符的优先级,比如像刚才先算的乘,后算的加法,那么自增自减这个东西啊,它是呃,不需要经过操作单的直接修改变量的值就可以了。那么最后的赋值操作之前中间的一个结果,比如刚才乘的结果,它这个临时结果,它是再次压回这个角度的,在然后最后的结果才复值给我的变量。那么对于一些相关的指令,如果大家感兴趣的话,可以看一下家训及规范里面啊关于指令的描述。好,那么今天呢,就讲到这里,谢谢大家。
我来说两句