if和switch的区别到底在哪
总所周知,if和switch在程序中的作用都是一样的,都是用来判断语句,用于判断接下来该执行哪一条语句。但,有过一定经验的程序员或工程师,在大量判断的情况下,都会采用switch,一般不会采用大量if else if,到这里就会有人说,这不是废话,switch语法比大量的if语句简单的多,哈哈哈哈,你只知其一不知其二。采用switch并不是完全因为它的语法简单,听我给你慢慢道来。
在某家咖啡厅,咖啡厅的服务员有三位,他们各司其职分别是,服务员甲:给客人餐盘,服务员乙:给客人饮品,服务员丙:给客人汉堡(我也不知道咖啡厅为什么有汉堡),咖啡厅刚刚开业,客人很多,排队的人也很多,第一位客人接受餐盘、饮品、汉堡之后,才会轮到第二位客人,重复一样动作。逐渐的老板发现,服务员甲在给客人餐盘之后,就会等待,直到服务员乙、丙服务完客人之后,服务员甲再回服务下一位客人。逐渐的老板发现了这个问题,本着压榨员工,充分发挥员工价值理念的老板必须想办法解决这个问题。
于是乎,老板改了制度,在服务员甲服务完客人之后,甲不必等待服务员乙、丙服务完上位客人之后才服务接下来的客人,只要服务员甲服务完客人之后,就必须接着服务下一位客人,这样的话员工就没有偷懒的现象了,老板开心坏了。 实际来看,服务员对客人服务的时间并没减少,增加的是咖啡店对客人的吞吐量。
这样一个小的现象,在程序中的英文叫做 pipeline ,我不太喜欢用英文来表达,我觉着用英文来表达,可能还没对某种现象或者事物理解到位吧,所以我就发挥国人的传统技能,起名字。我把这种现象称作为 流水线 ,怎么样很形象吧。在流水线上,第一位工人,可不会等待最后一位工人完成一次组装之后,在进行下一次组装(提前他们的速度一致)。
相同CPU也有这样的流水线,当将所编写的程序转换为机器码的时候,才会被CPU所识别,CPU会对机器码进行, 取值、译码、执行 等几种或者十几种不同操作,具体要看CPU型号。但 取值、译码、执行 这三种是每个CPU都会有的基本操作。
而if语句在机器语言中属于跳转语句,而且仔细想想是不是只有当if语句执行完之后,才会知道结果跳到那个位置,在if语句没有执行完。在三大步中,执行的动作,执行完毕,才会指挥CPU读取执行执行位置的数据。那执行动作未执行完之前,取值、译码也不能停下来。那怎么办,if未执行完,取值、译码怎么知道要跳到哪个位置。
这个时候CPU中有一个预判机制,根据前几次if执行的结果,预判接下来该执行哪个位置的数据,如果预判对了,那么就顺次执行,不需要任何改变。如果预判错了,那么取值、译码的结果抹掉从头开始。那我是这么说,口说无凭,那要怎么证明我刚才的说法呢。接下来给大家展示一个神奇的现象,来证明以上的说法。
判断分别两个个数组的里面的值,循环判断数组里面的值,如果大于某个值,则执行动作,如果不大于,则不执行动作。区别的关键就在于,这个数组,一个是有序的,一个是无序的。就刚才的说法来看,有序的数组应该会比无序的数值执行所需的时间要少。
为了避开程序的偶然性,对每个程序我都运行了三次。可以看到执行有序的数组所花费的时间确实要比执行的无序数组所花费的时间要少。
说完了if再来说说switch,大家想想看,在switch执行之前,switch只要自己将要跳到哪个位置上嘛,换句话说,在执行switch语句的时候,switch的参数是确定的吗,它是实参吗。想到这里大家应该明白了,在执行的时候switch中的参数是被确定下来的,在执行之间就已经预判出正确的结果了,也就不会出现预判错误,取值、译码中的值被抹去,重新取值、译码这样的现象出现了。所以才导致了在很多种情况下,switch要比多个if else,快得多。
若在文章中发现问题,欢迎各位批评指正。