2009年2月22日星期日

C Traps and Pitfalls--0(导读)

      冲动前言:C Traps and Pitfalls一直呆在硬盘上数载,当我开始读的时候,发现却只是1985年的那篇29页的论文,当然里面有些关于编译器的东西都改过了,所以有些Traps and Pitfalls都不存在了。于是开始看这本较新的2002中文版本,里面第0章导读的的第三个例子,就是那个数组赋值循环的例子,让我来了兴趣,遂有了此笔记系列。

      关于书籍:一本讲述C语言的书,自出版以来,历经14载,它一直都被各个书评站点(或书评人)列入“重点推荐”的清单中。尤为夸张的是,14年来,在它的18次印刷版本中,除去第二次印刷稍微修改过一些问题,以后的16次印刷,我们居然发现它的内容没有丝毫的变更!!!对于技术书籍,我想其精确性与权威性也算是奇迹了吧。

      关于作者:Andrew Koenig是AT&T大规模程序研发部(前贝尔实验室)成员。他从1986年开始从事C语言的研究,1977年加入贝尔实验室。他编写了一些早期的类库,并在1988年组织召开了第一个完全意义上的C++会议。在ISO/ANSI C++委员会成立的1989年,他就加入了该委员会,并一直担任项目编辑。他已经发表了C++方面的100多篇论文,在Addsion-Wesley出版了C Trap and Pitfalls,还应邀到世界各地演讲。他的妻子Barbara Moo现任AT&T网络体系结构部门负责人。在1983年加入贝尔实验室不久,她开始从事Fortran 77编译器的研究工作,这是第一个用C++编写的商业产品。她负责AT&T的C++编译器项目直到AT&T转让出软件开发业务。她还负责指导SIGS会议、Lund技术学院和Stanford大学。Andrew Koenig和Barbara Moo堪称C++研究领域的“第一神仙眷侣”,他们不光有着多年的C++开发、研究和教学经验,而且还亲身参与了C++的演化和变革,是对C++的变化和发展起到重要影响的人。他们两人还曾经合著了Accelerated C++: Practical Programming by Example。

      作者的第一个C程序:
#include <stdio.h>

main()
{
        printf("Hello world");
}

      执行结果却如下所示:
% cc prog.c
% a.out (注意,现在应该使用./a.out来运行这个默认的gcc编译出来的a.out了)
Hello world%

      这个结果怎么看起来和自己很多时候的那么相似呢,因为没有加上换行符'\n',所以那个unix提示符号'%'紧跟着world出来了。以后自己也要注意。

      第二个C程序例子,书上的是部分代码,我将代码补全如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        int i;
        int a[10];

        for (i = 0; i <= 10; i++) {
                a[i] = 0;
                printf("a[%d] = 0\n", i);
        }

        exit(0);
}

      使用gcc编译(gcc -o array array.c)并运行这个程序,运行发现会是一个死循环!虽然我知道应该是i < 10,9是数组的界限,但是却不知道为什么i <= 10的时候会是死循环,这个让我提起了兴趣。我尝试这使用gcc -Wall -o array array.c来编译程序,以为gcc会有警告,却发现任何警告信息!答案作者是在第三章3.6节讨论的。当然,我要继续往下看。

      我很赞同作者提出的"程序设计错误实际上反应的是程序与程序员对该程序的'心智模式'两者的相异之处",赞同Howard Gardner在《心灵的新科学》(The Mind's New Science)中的观点:人们的心智模式决定了人们如何认识周遭的世界。

      从较低的层面考察,程序是由符号(token)序列组成,犹如一本书是由一个一个的单词所组成的一样,将程序分解为token的过程,称为"词法分析"。
      组成程序的这些token,又可以看成是语句和声明的序列,犹如一本书可以看成是由单词进一步结合而成的句子的集合一样,符号(token)和单词如何组成更大的单元,组成什么样的语义,取决于语法细节,理解了语法细节,还需要理解语义细节才行。
      程序的连接,预处理等,也是现在我的认知空白,接着看书吧。


没有评论: