有了 elseif 为什么还要 switch case
引出
你有沒(méi)有想過(guò)既然有了if elseif, 為什么還要設(shè)計(jì)一個(gè)switch case的語(yǔ)法出來(lái)呢? 按理說(shuō), 一個(gè)語(yǔ)言的設(shè)計(jì)角度來(lái)說(shuō), 關(guān)鍵詞越少越好吧, 而且多出來(lái)一種選擇分支也沒(méi)有看出太大用處. 以下幾種switch case均可以寫(xiě)成if else的形式(java 代碼):
// 形式一 switch(a){case 1:break;case 2:break;default:break; } if(a == 1){ }else if(a == 2){ }else{}// 形式二 switch(a){case 1:case 2://do somethingbreak;default:break; } if(a == 1 || a == 2){ }else{}經(jīng)過(guò)多次嘗試, 所有的?switch case都可以轉(zhuǎn)換成if else. 那當(dāng)初涉及語(yǔ)言的大佬為什么要多此一舉搞了這么一個(gè)switch case出來(lái)呢? 是何用意? 甚至還要加一個(gè)時(shí)不時(shí)就忘記的break.
分析
雖然我們已然回不到當(dāng)初設(shè)計(jì)高級(jí)語(yǔ)言的哪個(gè)年代, 但是要繼承胡先生的思想: "大膽假設(shè), 小心求證".
為了了解為什么要設(shè)計(jì)出switch case, 就要先了解到它的特性, 借此來(lái)進(jìn)一步推斷設(shè)計(jì)的初衷, 亦或是彌補(bǔ)了if else的某些不足?
沒(méi)了,?switch case就這么點(diǎn)東西. 相比之下, 它只能做數(shù)字的相等校驗(yàn), 比if else要笨的多,?if else可以做所有的邏輯判斷.
如果只能做數(shù)字的相等判斷, 那么是不是可以將其想象成一個(gè)類(lèi)似數(shù)組的結(jié)構(gòu), 可以直接以下標(biāo)的形式進(jìn)行索引, 而不是像if else要一個(gè)一個(gè)的進(jìn)行判斷呢? 沒(méi)錯(cuò), 事實(shí)上還真的是這樣.
一個(gè)?switch case編譯后的執(zhí)行流程大致如下:
- 將每一個(gè)?case編譯后代碼的首地址保存到一個(gè)數(shù)組中.
- 根據(jù)傳入的值進(jìn)行判斷, 若數(shù)據(jù)元素不存在, 直接跳到 default.
- 若元素存在, 直接跳到索引處的地址繼續(xù)執(zhí)行.
- 其中的break標(biāo)志直接跳到結(jié)尾處.
畫(huà)個(gè)簡(jiǎn)陋的圖來(lái)對(duì)執(zhí)行過(guò)程進(jìn)行說(shuō)明, 生成的索引數(shù)組中保存著對(duì)應(yīng)跳轉(zhuǎn)的具體地址, 然后直接進(jìn)行數(shù)據(jù)的隨機(jī)訪(fǎng)問(wèn)就可以完成比較了.
看到這里,?switch case和if else的區(qū)別呼之欲出了.?switch case利用了數(shù)組的隨機(jī)訪(fǎng)問(wèn), 大幅度提升了判斷的效率. 但是為了隨機(jī)訪(fǎng)問(wèn), 這里生成了一個(gè)中間數(shù)組來(lái)保存地址, 空間換時(shí)間.
總結(jié)
那么, 設(shè)想一下, 在最開(kāi)始的語(yǔ)言設(shè)計(jì)時(shí), 為什么要有switch case這種空間換時(shí)間的做法呢? 我猜, 可能是因?yàn)楫?dāng)時(shí)的 CPU 處理速度比較慢, 所以考慮到如此處理來(lái)令程序的運(yùn)行速度加快. 亦或是最初的語(yǔ)言設(shè)計(jì)者為了追求完美, 將這種可加快條件判斷的的語(yǔ)法也加進(jìn)去了.
不過(guò)個(gè)人覺(jué)得, 如今的 CPU 運(yùn)行速度已經(jīng)如此速度了, 對(duì)于我們工作在應(yīng)用層的人, 這點(diǎn)速度的影響應(yīng)該是可以忽略不記的吧. 別說(shuō), 我試了幾種比較流行的語(yǔ)言, 發(fā)現(xiàn)Python就不支持, 哈哈, 用了這么久Python還是突然發(fā)現(xiàn)它不支持switch case, 由此可見(jiàn),?switch case我用的比較少.
最后, 其實(shí)我就是好奇有了if else為什么還要設(shè)計(jì)個(gè)switch出來(lái), 結(jié)果找著找著還真挺有意思的,?switch的底層實(shí)現(xiàn)居然是數(shù)組的隨機(jī)訪(fǎng)問(wèn), 果然, 就不能想, 全是學(xué)問(wèn).
總結(jié)
以上是生活随笔為你收集整理的有了 elseif 为什么还要 switch case的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Kubernetes中Pod生命周期
- 下一篇: centos6 yum安装mysql5.