无论一门语言有多么流行或多么优秀,它总是存在一些问题,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后面的语句就会执行,否则执行default后面的语句,default都可以出现在case列表出现的任何位置,如果没有default语句,那么switch语句就什么也不做,你不要指望它会提醒你它什么都没做。在C语言中,几乎从来不进行运行时错误检查——对进行解引用操作的指针进行有效性检查大概是唯一的例外,这是因为运行时检查与C语言的设计理念相违背,按照C语言的理念,程序员应该知道自己在干什么,而且保证自己的所作所为是正确的。switch的另一个问题是它内部的任何语句都可以加上标签,并在执行时跳转到那里,作者给出了一个例子,那就是当你的default语句写错的时候,比如把l字母写成了数字1,看起来很像对吧defau1t,不过功能可是大不相同,这意味着如果表达式不匹配任何常量表达式时它将什么也不干,因为没有default语句啊,然而即使这样,编译器也无法检查出错误来。当然switch语句里最大的问题还不是这个,而是它不会在每个case语句执行完毕后自动跳出,如果你不使用break语句来跳出,它将一直执行下去,在《C与指针》描述switch语句时有一句话我觉得非常合适,那就是case语句只是确认进入switch语句的入口,如果你不使用bre

