1.2 C语言的早期体验
1)C语言的基本数据类型直接与底层硬件相对应。C语言不存在内置的复数类型。C语言一开始不支持浮点类型,直到硬件系统能够直接支持浮点数之后才增加了对它的支持。
2)auto关键字显然是摆设。这个关键字只对创建符号表入口的编译器设计者有意义。它的意思是“在进入程序块时自动进行内存分配”,其他程序员不必操心auto这个关键字,它是缺省的变量内存分配模式。
3)表达式中的数组名可以看作是指针。
4)float被自动扩展为double。尽管ANSI C中情况不再如此,但最初浮点数常量的精度都是double型的,所有表达式中float变量总被自动转换成double。
5)不允许嵌套函数(函数内部包括另一函数的定义)。
6)register关键字。这个关键字能给编译器设计着提供线索,就是程序中的哪些变量属于热门(经常被使用),这样就可以把它们存放到寄存器中。但使用register关键字,虽然简化了编译器,却把包袱丢给了程序员。
1.3 C预处理器
它实现了三个主要功能:
1)字符串替换:#define MAX_LENGHT 1000
2)头文件包含:一般性的声明可以被分离到头文件中,并且可以被许多源文件使用。
3)通用代码模板的扩展:#define max(x, y) x>y?x:y
在宏的扩展中,空格会对扩展的结果造成很大的影响。对宏的使用,要适量使用。
1.9 ANSI C标准
1)实参char* s与形参const char* p应该是相容的,标准库中所有的字符串处理函数都是这样子的。那么,为什么实参char **argv与形参const char **p不能相容?
赋值是否合法,必须满足下列条件之一:
a. 两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针指向的类型必须具有右边指针所指向类型的全部限定符!
情况1:
char *p = "akakka";
const char *ch;
ch = p; //ok, char 和 char 是相容的类型,ch具有p的限定符(无)
情况2:
const float *f; //f是一个指针,f指向const float。
const char **ch;
char **ca;
由于char **和const char **都是没有限定符的指针类型,但是它们指向的类型不一样,前者指向char*,而后者指向const char*,因此它们是不相容的。