1.1 C语言的史前阶段
1.2 C语言的早期体验
C语言排斥强类型,即其是弱类型。它允许程序员需要时可以在不同类型的对象间赋值。C语言的许
多特性是为了方便编译器设计者而建立的:
1.数组下表从0开始
2.基本数据类型直接和底层硬件相关
3.auto 关键字是摆设(它是缺省的内存分配模式,其只对创建符号表入口的编译器设计者有用)
4.float被自动扩展为double(但在ANSI C中不再这样)
5.不允许嵌套,即函数内部包含另外一个函数
6.register关键字。告诉编译器,哪些变量经常被使用,可以把他们放在寄存器中。
1.3 标准I/O库和C预处理器
1.4 K&R C
1978年,C语言经典名著The C Programming Language出版了。这本书受到
了广泛的赞誉,其作者Brian Kernighan和Dennis Ritchie也因此名声大噪,
所以这个版本的C语言就被称为“K&R C"。出版商最初估计这本书将售出1000册
左右。截止到1994年,这本书大约售出了150万册(参见图1-3)。C语言成为最
近20年最成功的编程语言之一,可能就是最成功的。但随着C语言的广泛流行,
许多人试图从C语言中产生其他变种。
1.5 今天的ANSI C
ANSI C是美国国家标准化组织审定的一个C语言标准,其在1989年发布,并在次年被ISO
(国际标准化组织)接纳,ISO稍作修改后发布,所以ANSI C也可以称ISO C。目前ISO已经
发布了ISO C99和ISO C11。K&R C早于ANSI C,是对C语言经典名著
《The C Programming Language》的两位作者,Brain Kernighan和Dennis Ritchie的
名字的缩写。
1.6
1.7
1.8 ANSI C标准的结构
ANSI C与K&R C的不同
1.新的、非常不同,且重要的(仅一个)
ANSI C 把函数原型作为函数声明的一部分,原型的形式,其两者也有了很大的变化
2.新增的关键字
ANSI C 增加了 enum, const, volatile, signed, void等关键字
弃掉了K&R C中的entry等关键字
3.“安静的改变”
4.符号粘贴(token-pasting)
三字母词(trigraph),即用3个字符表示一个单独的字符,如两字母词\t表示“tab”, 三字母词??<表示“开放的花括号”。
1.9 阅读ANSI C标准,寻找乐趣和裨益
如下代码会报一条warning,“argument #1 is imcompatible with prototype…”,为什么?
foo(const char **p)
{
}
main(int argc, char **argv)
{
foo(argv);
}
原因分析(摘自ANSI C标准):
1.每个实参都应该具有自己的类型,这样它的值就可以复制给与它所对应的形参类型的对象
(该对象的类型不能含有限定符)
要使得上述赋值形式合法,必须满足下列条件之一:
1.两个 *** 作数都是指向有限定符或无限定符的相容类型指针
2.左边指针所指向的类型必须具有右边指针所指向类型的全部限定符
基于上述描述故实参char 能和型参const char匹配
但是:const float *类型并不是一个有限定符的指针类型,它的类型是“指向一个具有const
限定符的float类型的指针,即const修饰的是指针指向的类型而不是指针本身。
基于上条描述故char * 和 const char * 都是没有限定符的指针类型,但它们所指向的类型
不一样,(前者指向char ,后者指向 const char ,这是两个不同类型的对象),进而不相容,
所以报错。
第2章 这不是BUG,而是语言特性
2.1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)