在編寫代碼的過程中,經(jīng)常會(huì)遇到令人頭疼的問題,看似簡(jiǎn)單,其實(shí)陷阱很大。這里一下switch語句中的default分支問題。
常識(shí)
按照一般的編程規(guī)范,都是要求加上default分支的,它可以防止我們因?yàn)閷?duì)分支情況的考慮不周全,而出現(xiàn)難以預(yù)測(cè)的情況。同時(shí),每個(gè)分支也要求加上break。
而在有些問題當(dāng)中,往往就不加break,此時(shí),就會(huì)遇到default分支放哪兒的問題。
這個(gè)是比較基礎(chǔ)的問題,一般就是三種:
- default放在分支最前面
- default放在case的中間
- default放在分支最后面
我們還知道,如果不加上break語句,則會(huì)順序執(zhí)行匹配到的分支及以下的分支。
問題
看起來好像就這么多規(guī)律,可實(shí)際實(shí)驗(yàn)中,我還發(fā)現(xiàn)了一些問題。總結(jié)起來,即:
default語句只會(huì)在任何分支都匹配不到情況下執(zhí)行。
一旦有匹配到的分支,則default語句不論放在哪兒,都不會(huì)執(zhí)行。
下面給出一例代碼進(jìn)行說明
int main(){
int x = 2;
switch(x){
default:
printf("default\n");
case 2:
printf("2\n");
}
return 0;
}
由上面可以看出
當(dāng)x=1時(shí),沒有case語句匹配,則default分支執(zhí)行。
由于沒有break,則下面的case也跟著執(zhí)行。執(zhí)行結(jié)果為:
default
2當(dāng)x=2時(shí),有case語句匹配,則default分支不再執(zhí)行。執(zhí)行結(jié)果為:
2
好多人在說switch語句的時(shí)候,只會(huì)說沒有break語句,就會(huì)順序往下執(zhí)行。
最容易忽略的是,default分支不論放在哪兒,都只會(huì)在沒有case分支匹配的情況下,才會(huì)執(zhí)行。
實(shí)際工作中,要求是default分支要有,而且要有一些實(shí)際的處理操作,防止一些預(yù)料不到的情況。而且要求寫在最下面,這樣最安全,且看起來代碼最清晰。