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