為什么程序員都不喜歡使用switch评腺,而是大量的 if……else if 帘瞭?

正文

請用5秒鐘的時間查看下面的代碼是否存在bug。

image

OK蒿讥,熟練的程序猿應(yīng)該已經(jīng)發(fā)現(xiàn)Bug所在了蝶念,在第8行和第10行下面我沒有添加關(guān)鍵字break; 這就導(dǎo)致這段代碼的行為邏輯與我的設(shè)計初衷不符了。

缺點一. 語法正確芋绸,邏輯錯誤

這就是第一個理由為什么程序猿很少使用switch來做條件判斷媒殉,對于新手來說忘記寫break實在是再普通不過了,就算是老猿忘記寫也是時有發(fā)生的事情摔敛,而這個語法錯誤在諸多的語法檢查器上沒有辦法檢查出來的廷蓉,因為從語法角度來說是正確的!可是代碼的處理邏輯卻是錯誤的马昙!用if來重寫這段代碼的話桃犬,就不會發(fā)生這種錯誤。
image

上面的代碼為了保證正確我添加了else做一個邏輯上的保證行楞,其實如果不寫else攒暇,這段代碼也不會發(fā)生邏輯錯誤,而且一旦我忘記寫花括號的時候子房,語法編譯器是會提示我添加的形用,甚至可以使用eslint這種的工具強(qiáng)制我使用花括號,這樣就不會犯語法錯誤了证杭,一旦出現(xiàn)bug田度,那么肯定是我邏輯上的問題了。
缺點二 .死板的語法

switch盡管對于break很寬容解愤,但是對判斷條件很嚴(yán)苛镇饺,case后面只能跟常量,如果你用C編寫的話送讲,甚至只能用int類型作為判斷條件奸笤。對于我們這么瀟灑自如的程序猿來說,這種限制實在是太麻煩了李茫,用if的話揭保,別說是常量了肥橙,我用函數(shù)都可以魄宏,真正做到方便快捷。
缺點三 .需要子函數(shù)來處理分支

這個缺點跟缺點一有關(guān)存筏,為了防止漏寫break宠互,因此建議把分支處理方法獨(dú)立成一個子函數(shù)來處理味榛,這樣在閱讀代碼的時候就會減少忘記寫break帶來的bug予跌,那么用if來寫的話搏色,我想怎么寫就怎么寫,非常隨意自由券册,但是這也導(dǎo)致了代碼的可讀性大大降低频轿。
switch的優(yōu)點

既然switch有這么嚴(yán)重的缺點,那怎么在所有語言中依然會存在呢烁焙?那就說下switch的優(yōu)點吧航邢,它的優(yōu)點也剛好是它的缺點。
在很久很久以前骄蝇,那時候的電腦性能還不如一臺小霸學(xué)習(xí)機(jī)的時候膳殷,聰明的計算機(jī)科學(xué)家為了提高計算機(jī)的處理速度,將一些邏輯分支處理方法簡化了一下九火,把一些需要做邏輯判斷的操作給固定死赚窃,然后只要查表一樣一個一個對一下就能做出相應(yīng)的反應(yīng)了。
比如說a=0的判斷岔激,switch和if在cpu上面的處理方式是不一樣的勒极,switch是在編譯階段將子函數(shù)的地址和判斷條件綁定了,只要直接將a的直接映射到子函數(shù)地址去執(zhí)行就可以了鹦倚,但是if處理起來就不一樣了河质。

它首先要把a(bǔ)的值放到CPU的寄存器中,然后要把比較的值放到CPU的另一個寄存器中震叙,然后做減法掀鹅,然后根據(jù)計算結(jié)果跳轉(zhuǎn)到子函數(shù)去執(zhí)行,這樣一來就要多出3步的操作了媒楼,如果邏輯判斷多的話乐尊,那么將會比switch多處許多倍的操作,盡管寄存器操作的速度很快划址,但是對于當(dāng)時的學(xué)習(xí)機(jī)來說扔嵌,這點速度根本不夠用啊。
那還有一個問題夺颤,為什么要使用break來做一個判斷結(jié)束呢痢缎?這不是很容易造成語法錯誤了?那就要說到子函數(shù)的問題上了世澜。

在早起的電腦代碼中是沒有子函數(shù)的概念的独旷,那時候都是用goto隨意跳轉(zhuǎn)的,你想去第10行代碼,很簡單goto 10就可以了嵌洼。這種編程思維在C的早期階段還是一直受到影響的案疲,因此早期的C也沒有子函數(shù),都是一堆邏輯處理混亂在一起麻养,goto滿天飛褐啡,所以那時候你沒有一個最強(qiáng)大腦是寫不了程序的。那為了告訴程序我這里條件判斷處理結(jié)束鳖昌,就添加了break作為終止符號备畦。后來慢慢的有了子程序,有了更好的編程規(guī)范许昨,才一步一步的將寫代碼淪落到體力勞動萍恕。

后來發(fā)展的新語言為了標(biāo)榜自己的血統(tǒng),多少都要參考下C车要,然后就把switch這種詭異的語法也繼承下來了允粤。但是也不是所有的語言都照搬,比如Google發(fā)明的新語言golang和kotlin就又把switch包裝了一下翼岁,去掉了令人誤會的語法类垫,又讓switch變得靈活起來了,對了琅坡,在代碼重構(gòu)的時候悉患,還是用switch把,這樣看起來的確代碼更簡潔哦榆俺!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末售躁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茴晋,更是在濱河造成了極大的恐慌陪捷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诺擅,死亡現(xiàn)場離奇詭異市袖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烁涌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門苍碟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撮执,你說我怎么就攤上這事续捂』蓖危” “怎么了痹籍?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵鼎天,是天一觀的道長掂榔。 經(jīng)常有香客問我,道長症杏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任瑞信,我火速辦了婚禮厉颤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凡简。我一直安慰自己逼友,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布秤涩。 她就那樣靜靜地躺著帜乞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筐眷。 梳的紋絲不亂的頭發(fā)上黎烈,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音匀谣,去河邊找鬼照棋。 笑死,一個胖子當(dāng)著我的面吹牛武翎,可吹牛的內(nèi)容都是我干的烈炭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼宝恶,長吁一口氣:“原來是場噩夢啊……” “哼符隙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起垫毙,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤霹疫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后综芥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體更米,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年毫痕,在試婚紗的時候發(fā)現(xiàn)自己被綠了征峦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡消请,死狀恐怖栏笆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情臊泰,我是刑警寧澤蛉加,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響针饥,放射性物質(zhì)發(fā)生泄漏厂抽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一丁眼、第九天 我趴在偏房一處隱蔽的房頂上張望筷凤。 院中可真熱鬧,春花似錦苞七、人聲如沸藐守。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卢厂。三九已至,卻和暖如春惠啄,著一層夾襖步出監(jiān)牢的瞬間慎恒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工撵渡, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留巧号,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓姥闭,卻偏偏與公主長得像丹鸿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棚品,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容