03 语义陷阱
【C 陷阱与缺陷】(三)语义陷阱 0. 指针与数组 C 语言中数组与指针这两个概念之间的联系密不可分。 关于数组: C 语言中只有一维数组,而且数组大小必须在编译期就作为一个常数确定下来。数组元素可以是任何类型的对象,也可以是另外一个数组。(C99 允许变长数组) 对于一个数组,我们只能...
01 词法陷阱
【C 陷阱与缺陷 】(一)词法陷阱 一 内容 0. =不同于== 当程序员本意是作比较运算时,却可能无意中误写成了赋值运算。 1.本意是检查 x 与 y 是否相等: if(x = y) break; 实际上是将 y 的值赋值给了 x ,然后再检查该值是否为 0 。 2.本意是跳过文件中...
04 连接
【C 陷阱与缺陷】(四)连接 一 链接 0. 什么是连接器 C 语言的一个重要思想就是分别编译(separate compilation),即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合在一起。但是,连接器一般是与 C 编译器分离的,它不可能了解 C 语言的诸多细节。 **...
05 库函数
[C 陷阱与缺陷] (五) 库函数 C语言中没有定义输入/输出语句,任何一个有用的 C 程序(起码必须接受零个或多个输入,生成一个或多个输出)都必须调用库函数来完成最基本的输入和输出操作。ANSI C 标准毫无疑问地意识到了这一点, 因而定义了一个包含大量标准库函数的集合。从理论上说,任何...
06 预处理器
[C 陷阱与缺陷] (六) 预处理器 一 预处理器 在严格意义上的编译过程开始之前,C 语言预处理器首先对程序代码作了必要的转换处理。因此,我们运行的程序实际上并不是我们所写的程序。预处理器使得编程者可以简化某些工作,它的重要性可以由两个主要的原因说明(当然还有一些次要原因,此处就不赘...
08 建议
【C 陷阱与缺陷】(八)建议 1. 不要说服自己相信“皇帝的新装” 有的错误极具伪装性和欺骗性。比如,第一章原来的例子是这样写的: while (c == '\t' || c = ' ' || c == '\n') c = getc...
07 可移植性缺陷
[C 陷阱与缺陷] (七) 可移植性缺陷 了解更多有关可移植可以参考《How to Write Portable Software in C》(Prentice-Hall)。 本章主要讨论几个常见的错误来源,重点放在语言属性上,而非函数库属性上。 一 可移植性缺陷 1. 应对 C 语言标...
02 语法陷阱
【C 陷阱与缺陷 】(二)语法“陷阱” 零 0. 理解函数声明 请思考下面语句的含义: (*(void(*)())0)() 前面我们说过 C 语言的声明包含两个部分:类型和类似表达式的声明符。 最简单的声明符就是单个变量: float f, g; 由于声明符和表达式的相似,我们可以在声明符中任...