00:00
好了,同学们,那这两个呃方案呢,希望大家下来之后呢,好好的去想一想啊,看看使用哪种方案,建议还是使用这个第二种方案啊,因为第二种方案啊,它的好处是优点是什么呀,它的循环次数比较少一些啊,它的效率啊相对高一些,你上面说白了,这是比较执着的一种方式,就是叭叭叭一个一个取对吧,1234我们每个都判断是不是,哎这个呢,就。嗯,不需要判断了,直接加入了这个人为的因素啊,因为我们知道一是基数加等二的话,每一次取出就是基数啊,就不需要再判断了啊,这个是我们给出的这个方案啊。那么接下来我们看看这个循环嵌套的问题啊,比如说for循环里面嵌套一个for循环,应该怎么去理解这个这个程序,好吧,来这块呢,我们。升下级啊。
01:01
首先第一点啊,所有合法的控制语句。所有啊合法的控制语句都可以嵌套使用。这是第一点啊,那for循环嵌套。一个for循环,For循环嵌套一个for循环啊,执行原理是什么?我在这里提醒一下啊,提示一下,提示一下大家不要因为for循环中嵌套了一个for循环,就感觉这个程序比较特殊。啊,提示一下大家不要因为放循环中嵌套那个放循环就感觉这个程序比较特殊啊,实际上啊,大家可以这样。啊,可以这样看待,怎么看待呢?For循环嘛,是不是里边套了一个for循环是不是哎。在分析外层for循环的时候,你把里层for循环啊,看成是一个普通的Java语句。
02:04
啊,你就这么这么看就行了啊,在分析什么呢?在分析外层for循环的时候。啊,把里面的for就当做一段普通的Java语句。啊,或者是代码就行了啊,你不要给他特例化,说哎呀,这个for里面嵌套个for把我套懵了是不是,哎循环把我嵌套懵了,那我觉得这其实就是个心理问题啊,心理问题。来,Class,我们叫做four test05。嗯。我随便的写个例子啊,比如说for对吧?哎,因特类型I等于零啊,然后呢,I小于这个十对吧?然后I干什么?加加,然后system.out点2PRINT line打印输出谁啊哎,我们就输出I的值啊,输出I的值I。
03:09
那么这个程序对于我们来说,这是单层循环是吧?哎,单层for循环。啊单同步循环,那这个循环其实就是判断这个条件呗,不不是这个条件这个先执行这个出法表达式呗,然后判断这个条件,条件成立化,执行这个,然后呢,再执行这个,再执行这个,再执行这个,再执行这个,再执行这个,再执行这个对吧,直到有一天呢,加加之后呢,这个值啊哎不再小于十了,你接下来这个循环就结束,这个程序就是这样啊,那是零到九是不是,哎,我们编译一下这个程序啊Java c呢,去编译一下for test05.java啊然后呢,Java均运行for test05总。零到九对不对,哎很正常,那你说如果说我现在写了一个for in特,K呢等于零呢,K呢小于什么呀?哎,比如说K呢在这儿小于什么呀?二然后K干啥呀,加加,哎,那你说我这个循环。
04:01
system.out点打印,我输出这个K的值,这个K的值等于几呀?这是K的值等于几啊,等于零一对不对,哎,零一是不是循环两次啊,Java c呢,编译Java去运行,好大家看这个K是不是零和一,循环两次啊,这个循环是两次吧,哎,循环两次啊,循环两次啊,循环两次。K等于零和一啊,那你说如果我现在这个c.out这个代码就是从这个位置开始到这位置结束,这个代码执行几次,执行两回吧。执行两,因为你个循环两次嘛,这个大括号里边代码执行几次啊,执行两次对不对?哎,那你说如果我要是里边这个地方,它不是一个system.out.printline的话,那如果把这个for给它套进去会是什么样呢?对吧,那你别多想啊,你这个循环是不是。你在分析外边这个循环的时候,里边这个循环呀,你就不用管它。你就看成是个普通加法语句。明白吗?看成普通Java,普通的Java代码呗,你外边这个整体这个循环两次啊。
05:05
对吧,哎,因为大框里边代码执行几次啊,执行两次啊。大括号里面代表执行两次。但你大框里边如果写的是上面这个循环呢。对吧,拿过来。嗯。那你那你也看错呗,整个这个执行两次呗。我不知道大家理解不理理解这个啊,就是说整个这个程序就相当于什么呢?就相当于在这写了一次这个,又写了一次这个。写了一次又一次。就是说。你现在的这个程序就等于这一堆。就你现在的这个程序,就等于这一堆。因为你外边这个不是循环两次吗。所以你执行一次。然后呢,K加加之后呢。K小于二。
06:00
是吧,哎,再执行一次,所以相当于这执行一次,那再执行一次呗,那你这个执行不就是零到九吗?这个是不是执行零到九啊。对吧,哎,所以说我们现在呢,把这个注释掉。一遍。这这是不是一遍。第一点。第二遍。是不是,哎,我们这块呢,来个箭头了,区分一下啊,区分一下来看看这个里边的是不是输出的是零到九啊,那你外边放循环两次,那是零到九,再输入零到九呗。是不是我们来看一下啊,编译一下加上C编译加运行,你看这个零到九是不是,哎零到九。对吧,哎,我们如果说把上面的这个注释掉。把这个放开。那同样一个道理啊。
07:02
对吧,这个执行结果跟刚才那是一样的呀。对不对,哎,我们加上箭头啊,来这块也加上箭头,嗯。来看一下加va c编译加入运行。一样啊。这个是零到九,然后怎么着,哎,零到九就是说大家呢,现在要对这个嵌套这块啊,它的一个分析啊。我就怕呢,个别同学就把这个负二循环嵌套,当做被嵌套的这个for循环当做个例,就是当做比较特殊的东西,我怕你当成这个特殊的东西,你一旦把这个for啊。和这个for全部联合起来,揉杂在一起去分析,你就容易懵。你应该单独给它分离开,也就是说里边这个for你别多想,它就是一段普通的加代码,你就把它看成看成c.out.printline啊,你看成这个就行了。那你这个呢,循环过程当中,你这个大括号里面代码执行几次,那你就执行几次就行了,对不对,那如果里边不是一个C点二点plan是一个for循环,那你也别多想,那就相当于我这个for。
08:08
得执行一次对吧,然后紧接着怎么着,我这个再执行一次啊,为什么我这个for再执行一次,因为你外这个for控制了我里边这个for嘛,对不对,哎,因为外边这个for啊,它循环两次嘛,是不是。那K还是零和一对。K的值永远不会变。K的值不会变,K现在和I没关系。K。来这个我先注释点先不输出了啊,我们看看这个K的值。Java c编译,Java运行。K还是?零和一吗?对吧,嗯。跟上那个没关系啊,这个。Javac编译将运行。
09:00
是不是,哎,01K的值不会变,跟K没关系啊,现在是I的值。I的值你就单独你要分析里边这个for的话,你就把外边这个for注释你注释掉呗,对吧,你跟外边for没关系,来看一看这个for吧,各位这个for是什么?从零开始对不对?哎,是不是零小于十啊,然后是不是零加加对不对,那是这个整个这个方是不是输出零到九,当你这个方完全从零输出到九之后,你这个代码才算结束。你这个代码结束之后才能轮到K加。所以这个程序的一个执行原理呢,我在这里啊,咱们一步一步走吧,各位一步一步走啊,假如说刚开始的时候,我们肯定是从外边开始执行的,对吧?那这个执行怎么K,它是等于零的,零小于二吗?没问题,条件是不是为处啊,那现在我们是不是执行里边这个代码,那我给你执行里边这个代码,你跟外边是不是没关系,你给注释掉,你就在外面不存在呗,那这样的话,你就看看里边这个for它怎么执行的呀,它是不是输出I等于零,I小于十,I加加是不是输出零到九,你整个这个代码执行结束,是不是必须把零到九全部都输出完之后,那我问大家是不是这块才算结束,才能进到这个K加加里头执行。
10:16
就是这个代码的一个执行原理,我觉得大家还是得好好的理解一下啊。就嵌套如果是两层,两层还行,三层呢,三层还行,四层呢,对不对,嵌套这个东西呢,你看你怎么去理解啊,怎么去理解。就这块儿我们画个图,各位啊,画个图这块呢是K呢是小于。二。怎么走的呀?他怎么走的呀,来,咱们走一下。实际上是说呀,他先去执行这个对吧。K初始为零,K小于二,这个是不是处啊?好,这个是处对吧,好。这个如果为true的话,那紧接着是不是就开始执行我们这个大括号里面的代码了。
11:04
对吧,整个这个代码是不是就是一个循环体啊。如果你这个为true的话,就执行这个呗。对不对,那你执行它就好好执行它,你执行这个的话,跟外面就没关系,你你不用看,因为你这是一堆代码,你得把这堆代码执行结束啊,你得把这堆代码执行结束,就是这一堆代码执行结束啊,这堆代码其实是I等于零,I小于十,I加加,那相当于I从零开始输到九呗,那整个这个就零到九呗,就输出了。对不对,等你把整个这个代码执行结束,输出这个零到九结束之后,我们是不是就相当于这个代码就结束了,这个代码结束之后是不是进到K加加里边执行啊。对吧,啊,你你要记住啊,是先走这个再走这个,再走这个这个K加加之后,我问大家是不是原先是0K加加变成一一小于二嘛,还是true对不对,还是true的话,那我问你这个里边的代码,哎是个循环体,你就不用看它,把它特殊化啊,这个大框里边代码是不是又去执行啊,你又去执行的话,整个这个哎,For循环是不是又从零开始执行输出九啊。
12:14
对吧,哎,整个这个结束之后,那你这个K加加。在执行啊,对吧,哎,一变成么,二二小于二这个结果是不是在这就变成了false啊,那你这个变成false之后,我的这个大括号里边的这个代码是不是就不执行了,整个这个循环是不是就结束了,这个外边的负循环是就结束了,程序是不是就往下走了。对吧,所以说你这个应该是输出这个是零到九,然后外边再跳一次的话,诶,这个再会输出一个零到九。K循环两次,I循环十次,相当于I总共循环了20次,嗯,你这么说呀,嗯,不对啊,宇阳不对啊,你说的这个I不是你说的这个I,是同一个I对吗?我说一下啊,它并不是20次,实际上这个I。
13:08
它是两个不同的I,我不知道大家有没有理解啊,就是这个I啊,是两个不同的变量。A变量啊。是两份不同的内存。因为我不知道大家还记不记得我讲这个作用是怎么讲的,我说出了大括号就不认了,你第一次这个K加,呃,这个K小于二为的时候,进来里边执行,执行这个方行关的时候,它这个地方的I会初始化一次。会初始化一次啊,会初始化一次各位。并且它是最先执行,并且它初始化一次,那等这个循环结束之后,我是不是说过这个I变量的内存空间就释放掉了,对吧。等你K加加过来,K小于二,如果为处的话,它再进来执行这个循环体的时候,这里边儿的负循环再执行的时候,这个代码还会再执行一次。
14:04
啊,因为这是一个全新的for,跟之前的for没关系了,是两个不同的域啊,不同的域明白了是不是,所以说我们不能说I循环了20次,那你这个就太笼统了。啊,太笼统了。对,那这个I这块呢,其实是两块不同的I空间啊,不同的I空间行,咱们还是要多讨论一下啊,多讨论一下,讨论呢,咱们才可以碰撞出火花是不是好,那么这块的话,咱们继续再往下,你说比如说这个地方我给他拿过来放到这儿,你说我这个地方啊给它删掉,这个呢我也给它删掉。删掉之后干啥呢?我把I变量的定义啊,给它放到外边,大家觉得这个输出结果是啥。嗯。来来分析一下啊,给大家几秒钟时间,大家分析分析it I等于零放到外边。
15:03
会导致什么?会导致什么呢?死循环。I等于零在外边啊。这个还是循环两次。哎呀,这个位置咋回事啊,这是。这得改呀。如果为处,那肯定死循环了啊,那这个鱼儿说的对啊,来。K小于二啊,K小于二。I等于零。I小于10I加加。这个负循环会让I提升到多少?负循环结束之I提升到多少?提升到十对不对?哎,那么等于这个K加加执行K小于等于二,K小于二之后,是不是这个循环体里面当然还会执行啊。但是此时的I是不是是不是还是原先那个十啊,没变吧,十小于十结果就false吧,这里边是不是一一次都不执行。
16:03
所以这个程序是不是只输出一个零到九啊。是不是这个程序跟上面的不一样啊。因为这个定义是在外边的,这个定义是在里边的。定义到外边的话,就相当于它不会归零了。定义到里边的话,等于你下一次这个循环体在执行的时候,这个I它会还会归零啊,从零开始啊,从零开始才有机会小于十才会输出嘛,那如果是你I变量生命的负号循环外边的话,你第一次在执行的时候,你这个大括号里边代码会让这个I累加,累加累加到十,累加到十之后这个循环就结束了,结束之后可以加加,加加之后呢,它仍然小于二,在执行这个的时候呢,I的值没变,还是十十小于什么是false,所以这个里面一行也不会执行,所以整个这个程序输出是零到九啊一次。Java c呢去编译这个程序,Java去运行走。好,大家看这个Y是不是就是零到九啊一次啊。对不对,所以很好玩啊,这个循环嵌套呢,大家还是要去理解一下,这个for循环里边嵌套一个for循环,它的原理是啥?它的原理是什么啊,嵌套的原理啊。
我来说两句