00:04
现在我们有这个程序了。他可以给我们判断两个数谁大谁小,然后把大的那个输出给我。如果我们想要三个怎么办?我们要判断三个数,找到最大的那个。这这这这是有点复杂,我们先要捋捋啊,这个这三个数他们关系会怎么样,因为我们去做判断的时候。一次只能判断两个吗?对吧,我只能判断A和B的关系,要么A和C的关系,要么B和C的关系啊,当然我们现在是XYZ,那就XY啊,等他们关系,所以我们我们先来看看他们的关系会是会是怎么样的,然后再来想我们的程序该怎么写,当我们有三个XYZ3个数在那的时候,那我们可以先拿X和Y来做比较。那么X和Y做比较的时候就有两种可能,对不对?所以我们从最原始的地方出发呢?
01:03
我们可能有。一种可能是说X大于Y。那到了X大于Y这个状态下面呢,Y一定不可能是ma了,所以我们要判断的是X和Z的那个关系,那如果X是大于Z的。那很明确胜出的就是X,否则的话呢。那胜出的就是Z。如果从这条路过来,如果不对,不是X大于Y,那么X就被淘汰掉了。我们要判断的是Y和Z的关系,如果在这个过程当中,Y是大于Z的。OK,那胜出的就是Y,否则呢,胜出的就是Z。所以其实我们有这么一个。比较关系啊,或者可以叫做某种用来做判断的一种一种一种一种路径,那么这样的一种路径底下,我们怎么把它变成程序呢?
02:05
你看这是个if对吧,如果这个条件满足,那我们走这条路,Else我们在这儿了。然后这个圆框框也是个一对吧,如果X大于Z的,那我们走这条路,Else呢。我们走这条路,那这也是一个F,如果Y大于Z的,那这是这条路,L呢是这条。好,我们照着这个看看能不能把程序给写出来,所以呢,当我们判断了X是大于Y之后,我们不能立刻得出max就是X,我们还得再做一次判断,说如果。X大于Z的。那我们可以说ma就是X else呢,我们得说那个max呢是Z。如果X。OK,我们还没有Z,我们把Z加进来。但这里也得有Z等于in next int好。
03:03
L的话呢,我们还不能确定的是Y和Z谁大,当然X已经被排除了,所以我们还要判断说Y大于Z。那如果Y大于Z条件是满足的,OK,那当然就是max,就是y else的话呢,我们还得说max等于Z。看上去挺复杂的啊,呃,很多层。这是一种我们叫做嵌套的if。你看当if的条件满足的时候,我们还有一个if在里头,If的条件不满足的时候,我们也还有另外一个if在里头,如果if的条件满足的时候,要做的是另外一个if语句,就是嵌套的if。但从逻辑关系来说,这没有什么特殊的,我们的这个代码如果表达为流程图的话呢,就是右边的这个流程图啊,我们看到这个流程图是个挺完美的东西,因为每一个判断都有yes no,每一个判断都有yes no啊,所以这是一个呃,这非常完美的一种我们叫做二叉数的东西,因为所有的分支都有两个出口啊,分所有的分支都有两个出口,这是一种层叠的if语句,当然如果if后面只有一句话,我们也可以把大括号去掉,所以就可能会看上去像这个样子,如果code等于ready的话,那我们再判断,如果count小于20,一切正常,如果不是这样子的话,否则的话,那么我们要继续等待。
04:24
那在这种事情里面呢,就会出现一个问题。比如我们这句话,有一个if,有一个if,还有一个else,那这个else和哪个if是匹配的呢?它会不会和第一个if去匹配呢?假如我们把代码写成这个样子,说我的L和那个衣服是对齐的,它是不是表明这个L4和那个衣服是匹配的呢?不是。对于Java来说,我们的规则很简单。Else总是和最近的那个F匹配,最近的是什么意思?对这个代码来说,最近的这个L是最近的一幅是这个一幅。
05:01
而不是那个if,所以这个L不管你把它放在哪儿。不管你缩进在哪,它总是和第二个if是匹配的,因为那是它最近的F。那如果我们希望这个L能够和第一个if匹配,我们需要这样做,我们给它加上大括号。这一对大括号加上之后就很明白说这个F呢,是这个if条件成立的时候做的事情,而这个else。就和里面那个衣服绝缘了。它不再是最近的了,因为根本都不在一起,就没有远近可讲啊,对这个L来说,它的if就只有是第一个F可以匹配了,所以我们的建议是说,如果你有if或者else,那后面一定要去跟上一堆大括号,就算它后面只有一条语句,也跟上一堆大括号,这样做呢,可以有效的避免。计算机或者别人对你的代码的误解加上一大括号总是对的。如果有这样一个分段函数,在数学当中分段函数当然也很常见啊,他说,呃,如果呢,X小于零的,那么它的结果是负一,如果X等于零的,它的结果是零,如果X大于零的,那么它的结果是2X。
06:09
这样的东西,我们怎么写Java的代码来表达它呢?我们可以把它写成这个样子,如果X小于零。那么我们做F等于负一的事情。Else,如果X等于零。也就X小于零这个条件不满足的时候,我们还得再判断一次对不对,那l ifx等于零的话呢,当然别忘了等于等于零啊,我们做比较的时候,两个等号,那F等于零在X。这时候不需要再有条件了,对吧?因为X如果不大于零,X如果不小于零,X也不等于零,那么剩下的就是X大于零,所以呢,最后一个条件我们不需要再去判断了,那我们就说F呢,等于二乘以X。啊,那这样的写下来的这种if语句呢,我们把它叫做及联的,因为我们会有if l CF f,但这中间可能还会有很多层其他的LCF,这叫做吉联的。
07:08
If语句,If else if语句啊,那如果存在这样的if else if语句的时候呢,我们会让所有的else对齐啊,所有的else对齐。那么它可以表达为这样的一个流程图,小于零吗?是的,怎么样,不是的话,我们再判断等于零吗?是的,怎么样,不是的话再做一个什么什么样的事情啊,所以这是吉连的。那么通常呢,他就表达为这个事情,如果条呃条件满足做什么,否则的话,再判断一个条件在做什么,在else怎么样。所以我们看到所有的else和if是对齐的,而不是为了让这个L和这个if对齐,把它再推进去啊,直连的if语句至少要写成这个样子,就是如果你直连了很多层的话,如果你不是这么写。你让L和if去对齐的话,你就会看到你的代码刷排到很右边去了啊,那这样子排到很右边的这种这种代码看起来就很难看了嘛。
08:05
但我们现在在这个代码当中呢,还看到一个小的细节啊,我们代码现在写成这个样子,说如果条件怎么样,那我F怎么样怎么样,最后呢,我再再来说说这个F,另外一种写法呢,是说如果X小于零,我就去输出那个负一的值了。那这两种写法呢,我们会更喜欢。左边那种。左边的一种写法,我们把它叫做单一出口,也就是说这个程序只有一个地方来做F输出的这个事情,而不是到处去输出F。你想我们考虑一个非常简单的场景啊,如果将来我们要在这个计算的结果的基础上,把这个F加个1.0,然后再做输出。那么对于左边的这种写法来说,单一出口嘛,那我只需要在这个输出之前让F等于F加1.0就可以了。而对右边这种做法的话,那我需要在每一个system out那个地方去加上那个去加那个那个结果啊,那个去加1.0这种事情。
09:07
所以这两个显然单一出口是更加好的一种代码风格。
我来说两句