第2章 这不是Bug,而是语言特性
语言的细节决定了一种语言到底是可靠的还是容易滋生错误的。
C语言是一门神奇的编程语言,具有许多优点,不过在欣赏C语言的优点是也不要忘了分析它的缺陷。
●多做之过
语言中存在某些不应该存在的特性。
switch存在其中一个问题就是,它对case可能出现的值太过放纵了。switch的另一个问题是它内部任
何语句都可以加上标签,并在执行时跳转到那里,这就有可能破坏程序流的结构化。也许switch语句最大
的缺点是它不会在每个case标签后面的语句执行完毕后自动停止。
“fall through”的意思:如果case语句后面不加break,就依次执行下去。多数情况下,为避免此
缺省行为而不得不加上一条额外的break语句来改变。
ANSI C引入了一个新特性:相邻字符串常量将被自动合并成一个字符串的约定。这种自动合并意味着
字符串数组在初始化时,如果不小心漏掉了一个逗号,编译器将不会发出错误信息,而是悄无声息地把两
个字符串合并在一起。
软件对象在大多数情况下应该缺省地采用有限可见性。当程序员需要让它全局可见时,应该采用显式
的手段。
●误做之过
语言中有误导性质或不适当的特性。
C语言存在的一个问题就是它太简洁了,仅增加、修改或删除一个字符就会使原先的程序变成另外一个仍
然有效却全然不同的意义。许多符号在不同的上下文环境里有不同的意义。
C语言有些运算符存在错误的优先级:当按照常规方式使用时可能引起误会的运算符。建议在C语言中
牢记两个优先级就够了:乘法和除法先于加法和减法,在涉及其它的操作符时一律加上括号。
●少做之过
语言应该提供但未能提供的特性,如标准参数处理以及把lint程序错误地从编译器分离出来。
许多操作系统能够在程序中区分运行是选项和其它参数,但UNIX却不能,ANSI C也不能。
在C语言中,空格可能从根本上改变程序的意思或有效性。
在C语言中,自动变量在堆栈中分配内存。当包含自动变量的函数或代码块退出时,它们所占用的内存便被回收,它们的内容肯定会下一个所调用的函数覆盖。
Lint程序是软件的道德准则。当你做错事时,它会告诉你哪里不对。应该始终使用Lint程序,按照它的道德准则办事。
tengjingshu_112148725 2009-4-19 00:39
用户184981 2009-4-18 13:22
tengjingshu_112148725 2009-4-18 10:44