Expert C Lanuage 学习笔记----1、穿越时空的迷雾(1)

Expert C Lanuage 学习笔记----1、穿越时空的迷雾(1)

1、First Mistake

几乎每个C语言编程新手都犯过下面错误:

if( i = 3 )

正确应该是

if( i == 3 )

这种错误写法一般编译器是不会报错的,IAR会报use of “=” where “==” may have been intend警告,所以为了避免忽视警告引发的问题,可以按下面写法:

if( 1 == i )

如果少了一个等号,编译器会报expression must be a modifiable lvalue错误。

2、C语言的早期体验

1、C语言排斥强类型
类型系统的目的是保护程序员,防止他们在数据上进行无效的操作,类型系统的加入从未在可用性进行认真的评估和严格的测试。C语言排斥强类型,它允许程序员在需要的时候可以在不同类型的对象间赋值。时至今日,许多C程序员认为“强类型”只不过是敲击键盘的无用功。
2、C语言方便编译器设计者的特性
编译器设计者的金科玉律:效率(几乎)就是一切,而C语言早期的主要客户就是编译器设计者,所以,C语言有很多根据编译器计者的思路发展的语言特性。

(1) 从0开始而不是1开始:编译器设计者选择0开始,因为偏移量的概念在他们心目中根深蒂固。
(2) C语言的基本数据类型直接与底层硬件相对应。
(3) auto关键字显然是摆设:auto的意思是“进入程序块时自动内存分配”.
(4) 表达式的数组名可以看作数组指针。
(5) float被自动拓展为double(C期,现在ANSI情况不是如此)。
(6) 不允许嵌套函数(函数内部包含另一个函数的定义):这简化了编译器,并稍微提高了C程序的运行时组织结构。
(7) register关键字:程序中哪些变量经常使用,就放在寄存器里。使用register,简化编译器,麻烦了程序员。

3、标准I/O库和C预处理器

在许多其他语言中,编译器会植入一些代码,隐式的的调用运行支持工具,但在C语言中,绝大多数库函数都需要显示调用。例如,在C语言(必要时),程序员必须管理动态内存的使用,创建各种大小的数组,测试数组边界,并进行范围测量。
标准I/O函数库是在Mike Lesk在1972年编写的基础上优化和裁剪生成的。差不多在这个时候,C预处理器被加入,它所实现的三个主要功能如下:

1、字符串替换:通常用于常量的符号名。
2、头文件包含:一般性的声明可以被分离到头文件中,并且被许多源文件使用。虽然约定采用“.h"作为文件的拓展名,但在头文件和包含实现代码的数据库之间在命名上却没有采用相应的规定,让人很不快。
3、通用代码模板的拓展:与函数不同,宏(marco)在连续几个所接收
的参数的类型可以不同(宏的实际参数只是按照原样输出)。这个特性加入稍晚,而且笨拙。在宏的拓展上,空格会对拓展结果造成很大影响。

你可能感兴趣的:(C)