無(wú)論一門語(yǔ)言有多么流行或多么優(yōu)秀,它總是存在一些問(wèn)題,C語(yǔ)言也不例外。本章討論的重點(diǎn)是C語(yǔ)言本身存在的問(wèn)題,作者煞費(fèi)苦心的用一個(gè)太空任務(wù)和軟件的故事開(kāi)頭,也用另一個(gè)太空任務(wù)和軟件的故事結(jié)尾,引人入勝。
關(guān)于這兩個(gè)故事,在這里不說(shuō),有興趣的朋友還是建議買這本書去看看,這本書用相當(dāng)輕松的文字而又不失深沉地向我們道來(lái)C語(yǔ)言的各種特性與特別的用法。
書中提到一種分析編程語(yǔ)言缺陷的方法,讓我們能夠詳細(xì)的去分析各種編程語(yǔ)言的缺陷,即把所有的缺陷歸于3類:不該做的做了(多做之過(guò))、該做的沒(méi)做(少做之過(guò))、該做的做了但不合適(誤做之過(guò)),本章也是按照這樣一種分析方法來(lái)分析C語(yǔ)言本身存在的一些問(wèn)題,由于C是一門神奇的語(yǔ)言,被許多平臺(tái)所選用,也被大家所學(xué)習(xí),所以了解C語(yǔ)言是一件相當(dāng)有必要的事情,本章就是從缺陷來(lái)了解C語(yǔ)言。
多做之過(guò),就是語(yǔ)言中存在某些不應(yīng)該存在的特性,包括容易出錯(cuò)的switch語(yǔ)句、相鄰字符串常量自動(dòng)連接和缺省全局作用域。
首先說(shuō)說(shuō)switch語(yǔ)句吧,這個(gè)語(yǔ)句在多條件的時(shí)候使用率還是相當(dāng)高的,相比大量if語(yǔ)句,我還是比較傾向于它的。switch語(yǔ)句的一般形式如下:
switch(表達(dá)式)
{
case 常量表達(dá)式1:語(yǔ)句1; break;
....
case 常量表達(dá)式n:語(yǔ)句n; break;
default:語(yǔ)句;break;
}
每個(gè)case結(jié)構(gòu)由3個(gè)部分組成,關(guān)鍵字case;其后的常量表達(dá)式;以及后面的冒號(hào),當(dāng)表達(dá)式的值與case后面的常量表達(dá)式匹配時(shí),case后面的語(yǔ)句就會(huì)執(zhí)行,否則執(zhí)行default后面的語(yǔ)句,default都可以出現(xiàn)在case列表出現(xiàn)的任何位置,如果沒(méi)有default語(yǔ)句,那么switch語(yǔ)句就什么也不做,你不要指望它會(huì)提醒你它什么都沒(méi)做。在C語(yǔ)言中,幾乎從來(lái)不進(jìn)行運(yùn)行時(shí)錯(cuò)誤檢查——對(duì)進(jìn)行解引用操作的指針進(jìn)行有效性檢查大概是唯一的例外,這是因?yàn)檫\(yùn)行時(shí)檢查與C語(yǔ)言的設(shè)計(jì)理念相違背,按照C語(yǔ)言的理念,程序員應(yīng)該知道自己在干什么,而且保證自己的所作所為是正確的。switch的另一個(gè)問(wèn)題是它內(nèi)部的任何語(yǔ)句都可以加上標(biāo)簽,并在執(zhí)行時(shí)跳轉(zhuǎn)到那里,作者給出了一個(gè)例子,那就是當(dāng)你的default語(yǔ)句寫錯(cuò)的時(shí)候,比如把l字母寫成了數(shù)字1,看起來(lái)很像對(duì)吧defau1t,不過(guò)功能可是大不相同,這意味著如果表達(dá)式不匹配任何常量表達(dá)式時(shí)它將什么也不干,因?yàn)闆](méi)有default語(yǔ)句啊,然而即使這樣,編譯器也無(wú)法檢查出錯(cuò)誤來(lái)。當(dāng)然switch語(yǔ)句里最大的問(wèn)題還不是這個(gè),而是它不會(huì)在每個(gè)case語(yǔ)句執(zhí)行完畢后自動(dòng)跳出,如果你不使用break語(yǔ)句來(lái)跳出,它將一直執(zhí)行下去,在《C與指針》描述switch語(yǔ)句時(shí)有一句話我覺(jué)得非常合適,那就是case語(yǔ)句只是確認(rèn)進(jìn)入switch語(yǔ)句的入口,如果你不使用bre