第1章 C:穿越时空的迷雾
●C语言的史前阶段
C语言源于通用电气、麻省理工和贝尔实验室在1969年合作的一个名为Multics失败的项目。在该项目失败后,研究人员Ken Thompson和Dennis Ritchie用汇编语言编写一个名为UNIX的操作系统。UNIX经过若干次的改写,由最初的汇编改成BCPL语言,再改成B语言、New B语言,到1973年左右采用C语言改写了UNIX系统。
编译器设计者的金科玉律:效率(几乎)就是一切。
●C语言的早期体验
数组下标从0开始而不是从1开始;
C语言的基本数据类型直接与底层硬件相对应;
auto关键字显然是摆设;
表达式中的数组名可以看作是指针;
float被自动扩展为double;
不允许嵌套函数(函数内部包含另一函数的定义);
register关键字。使用了register关键字,简化了编译器,却把包袱丢给了程序员。
●标准I/O库和C预处理器
C语言原先没有定义I/O,而是由库函数提供。后来这实际上成了标准机制。
C预处理器的3个主要功能:
字符串替换;
头文件包含;
通用代码模板的扩展。对宏这样的预处理器只应该适量使用。
宏最好只用于命名常量,并为一些适当的结构提供简捷的记法。宏名应该大写,这样很容易与函数调用区分开。千万不要用C预处理器来修改语言的基础结构。
●K&R C
1978年《C程序设计语言》出版,这个版本的C被成为K&R C。
●今日之ANSI C
任何学习或者使用C语言的人都应当使用ANSI C,而不是K&R C。
●K&R C和ANSI C之间的区别
主要分成四类:
新的、非常不同的、并且很重要的东西。唯一属于这类区别的特性是原型-把形参的类型作为函数声明的一部分。
新的关键字。ANSI C增加了一些关键字:enum、const、volatile、signed、void。
原先的有些语言特性依然合法,但意思有了一些轻微的改变。
最后一类在现实中几乎不可能碰到。
ANSI C中最重要的新特性就是“原型”,这种特性取自C++。原型就是函数声明的扩展,这就允许编译器在参数的使用和声明之间检查一致性。
●容易混淆的const
关键字const并不能把变量变成常量。在一个符号前加上const限定符只是表示这个符号不能被赋值。也就是它的值对于这个符号来说是只读的,但它并不能防止通过程序内部(甚至是外部)的方法修改这个值。const最有用之处就是用它来限定函数的形参,这样函数将不会修改实参指针所指的数据,但其他的函数却可能会修改它。const和*的组合通常只用于在数组形式的参数中模拟传值调用,它声称“我给你一个指向它的指针,但你不能修改它”。