为什么程序员不喜欢使用switch,但是很多if ... else if?
来源:3g.163.com/tech/article/E02RDE6C0511SDDL.html缺点1.纠正语法和逻辑错误。
缺点2.语法严格。
缺点3.需要子功能来处理分支交换机的优点。
请花费5秒钟的时间查看以下内容:代码中是否存在错误。
好的,熟练的程序员应该已经找到了错误。
我没有在第8行和第10行下添加关键字break。
这导致该代码的行为逻辑与我的原始设计不一致。
缺点1.语法正确,逻辑错误。
这是程序员很少使用switch进行条件判断的第一个原因。
对于新手来说,忘记写休息确实很常见,即使老猿忘记写了,也会不时发生。
无法在许多语法检查器上检查此语法错误,因为从语法角度来看它是正确的!但是代码的处理逻辑是错误的!如果使用if重写此代码,则不会发生此错误。
为了确保上述代码的正确性,我添加了else进行逻辑保证。
实际上,如果您不编写其他代码,则此代码不会有逻辑错误。
一旦我忘记写花括号,语法编译器就会提示我。
此外,您甚至可以使用eslint之类的工具来强迫我使用花括号,这样我就不会犯语法错误。
一旦发生错误,对我来说这肯定是一个逻辑问题。
缺点二。
尽管刚性语法开关很容易破译,但对判断条件却非常严格。
大小写只能跟随常量。
如果用C编写,则只能将int类型用作判断条件。
对于像我们这样的程序员,这种限制太麻烦了。
如果使用if,更不用说常量了,那么我可以使用函数,这确实方便快捷。
劣势三。
需要一个子功能来处理分支。
该缺点与第一个缺点有关。
为了防止丢失中断,建议将分支处理方法分成一个子函数来处理,以便在读取代码时减少忘记写入中断的情况。
如果您使用if写,我可以写任何我想写的东西。
它是非常自由和任意的,但是这也导致代码的可读性大大降低。
开关的优点由于开关具有如此严重的缺点,因此如何在所有语言中仍然存在呢?让我们谈谈切换的优势。
它的优点恰好是缺点。
很久以前,当计算机性能不如小霸王学习机时,为了提高计算机的处理速度,智能计算机科学家简化了一些逻辑分支处理方法,以及一些需要逻辑判断的操作来修复它,然后只需一张一张地查找表并做出相应的反应。
例如,如果判断a = 0,则在cpu上处理的方式切换和if是不同的。
只要将a直接映射到子功能的地址,Switch就会在编译阶段将子功能的地址绑定到判断条件。
只是执行它,但是if处理是不同的。
首先将a的值放入CPU的寄存器中,然后将比较后的值放入CPU的另一个寄存器中,然后进行减法,然后跳转到子功能以根据计算结果执行。
还有另外三个操作。
如果有更多的逻辑判断,那么操作将比切换多很多倍。
尽管寄存器的操作速度非常快,但是对于当时的学习机来说,这个速度还不够。
。
然后还有另一个问题,为什么要用断断续续来判断呢?容易引起语法错误吗?然后是子功能的问题。
在早期的计算机代码中,没有子功能的概念。
当时,goto被用来随意跳跃。
如果要转到第10行代码,goto 10非常简单。
这种编程思想在C的早期仍然受到影响。
因此,早期的C没有子功能。
这是一堆混乱的逻辑处理过程。
后藤在天上飞。
因此,那时,如果没有最强大的大脑,您将无法编写程序。
的。
为了告诉程序条件判断过程已结束,我添加了break作为终止符号。
后来,有了子例程和更好的编程规范,我逐渐将代码编写工作减少到体力劳动。
为了宣传其血统书,后来开发的新语言不得不或多或少地引用C,然后继承了switch的怪异语法。
但并非所有语言都被复制。
例如,谷歌,golang和kotlin发明的新语言,再次包装了开关,消除了误解的语法,并使开关更加灵活。
顺便说一下,在代码重构中。
使用开关时,看起来代码更简洁