编辑: 黑豆奇酷 2015-08-31
1.

1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 目录 简介 第0章 引言 第1章 词法陷阱 1.1 = 不是 == 1.2 &

和 | 不是 &

&

和 || 1.3 词法分析中的贪心法 1.4 整型常量 1.5 字符串和字符

1 C陷阱与缺陷 [美]Andrew koenig著 内容提要 作者以1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验,创作了这个对C 程序员具有珍贵价值的经典著作.写作本书的出发点不是要批判C语言,而是帮助C程序员绕 过编程过程中的陷阱和障碍. 全书分为8章,分别从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个 方面分析了C编程中可能遇到的问题.最后,作者用一章的篇幅给出了若干具有实用价值的建 议. 本书适合有一定经验的C程序员阅读学习,即便你是C编程高手,本书也应该成为你的案头必 备书籍. . . . . . 2016.10.30 开始翻译 简介

2 第0章 引言 我1966年用Fortran写了我自己的第一个程序,试图计算并打印10000以内的斐波那契序列 (就像 1,1,2,3,5,8,13,21...第二个数字之后的每个数字都是它前面两个数字的 和),当然,它没能运行起来: I =

0 J =

0 K =

1

1 PRINT 10, K I = J J = K K = I + J IF (K - 10000) 1, 1,

2

2 CALL EXIT

10 FORMAT (I 10) Fortran 程序员很明显能看到这个程序没有END语句.后来我把END语句加上了,尽管如此, 程序依然不能编译,只给出了一个神秘的错误信息:ERROR 6. 对手册仔细的阅读最终指出了问题所在:我所用的Fortran编译器无法处理四位数以上的整型 常量.把10000改成9999就把问题解决了. 1977年我写了自己的第一个C程序.很自然地,它也没能跑起来: #include main() { printf( Hello world );

} 这个程序一次就编译通过了.尽管结果有点奇特:终端的输出是类似这样的: % cc prog.c % a.out Hello world% 这里的%是系统提示符,是系统用来告诉我该我输入了时所显示的字符串.%紧接着Hello world是因为我忘记了告诉系统要开始一个新行.3.10节(51页)会讨论这个程序中一个极小的 错误. 第0章 引言

3 这两种程序之间真的有本质上的不同.Fortran的例子包含两个错误,但是Fortran很好地指出 了这些错误.而那个C程序技术上来说是正确的――从机器的角度来说,它没有错误.因此也 没有错误信息.机器精准无误地做到了我让它做的事,它只是没有完全按照我脑中所想的那 样去做. 这本书关注第二种错误:程序没有按编程者原本期望的方式执行.除此之外,这本书会关注 一些C语言中可能出现这种奇怪错误的方式.例如,看下面这段初始化一个大小为N的数组的 程序: int i;

int a[N];

for (i = 0;

i s = ->

;

里,两个 - 代表两个不同的意义.更准确地说,两个 - 各是不同的符号(token)的一部分,第 一个是 ->

中的一部分,第二个则是字符串的一部分.此外, ->

和组成它的两个字符都有完 全不同的含义. token代表程序中这样的一个部分:它在语句中作为一个单词总是扮演同样的角色,在感觉 上,它每次出现时都是表达相同的含义.同样的字符序列可以在一个上下文中属于一个 token,而在另一个上下文中又属于完全不同的另一个token.编译器中把一个程序分割成 token的部分通常叫做词法分析器. 另一个例子,考虑下面的语句: if (x >

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题