笔记范围:《The C Programming Language》第一章
应该说,算上这次,我应该是第四次读这本书了,每次重读都收获不少。都引起我新的思考,很难想象这本一本技术小书给人留下的感觉是如此深刻,如此令人回味,本章的内容是很容易理解的概念,对于编程学习者是最起码的知识,但是有些东西还是被初学者忽视。以至于在各个技术社区的初学者问题中层出不断。其实这些东西,在第一章就得到了比较完整的解释,下面只是把他们提出来强调一下,
第一.关于循环终止。在很多书籍中都存在这样的循环语句:
while ( getchar() != EOF ) {….}
很多人不明白这个EOF为何物?具体如何操作?以至于让上面的语句变成了无限循环,呵呵,其实EOF。是文件结束符(end of file),在第七章有说明。其为系统常量。值为-1,当然你在终端输入-1,循环并未结束,why?how to do?恩,你在《c专家编程》里会了解到,c的第一批使用者都是系统设计者和编译器设计者。在他们的理念里,信息往往以文件为单位的。这个标志只是文件结束的状态,一般不由用户提供。而键盘等输入端在os中是个极其特殊的文件。需要用户显式标志文件结束。说是系统常量当然有着系统依赖性,因此不同的系统标志方式就完全不同。Windows下是ctrl+z。linux下是ctrl+D.另外EOF其实不用显式说明。上面的代码与此完全等价:
while( getchar() ) {……}
第二.声明和定义。尽管这个问题地球人都知道,但是真正说的清楚的人并不多。有人认为变量的声明和定义没有什么区别。有人认为这个与初始化有关系(我曾经就这样白痴,汗~~~),对于后者那就是根本就不明白这两个概念,声明只是给编译器一个提示,有这么个名字存在于程序中,和运行环境毫无关系。可以重复出现,定义是具体分配内存空间和指定了变量的位子(左值),在同一域中只能出现一次;对于前者的观点。在单文件程序中。几乎找不到错误。但如果你把这样的句子放人头文件,int a;一旦这个头文件被重复包涵。必然出现链接错误。其实这样:
extern int a;//声明
int a;//定义
第三.字符数组和字符串。有人认为这两个是同一概念,是这样吗?不,完全不是,前者为容器(数据结构),后者为数据。这样说也许太理论化,好,我们来改写下那个hello world
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf( "\0hello world " );
system("pause");
return 0;
}
呵呵,什么也没有?是的。还记得字符串是怎么结束的吗?\0 "\0hello world "是个常量数组。但是字符串却是“”。字符数组和字符长度是不一样的,
这章尽管非常简单,但是每个例子都经典之作,你能从代码中学到文字中不能学到的东西。建议你每个都抄一遍,