1988年,美国国家标准协会(ANSI)为C语言指定了一个精确的标准(即ANSI C
)。该标准保持了C的表达能力
、效率
、小规模
以及对机器的最终控制
,同时也保持了符合该标准的程序的可移植性
。ANSI C相较于之间的版本,具体描述了结构赋值
、枚举
和一种的新的函数声明和定义方式
。新的函数声明和定义方式允许在使用过程中对函数的定义进行交叉检查。同时ANSI C为C语言定义了标准库
,该标准库说明了C语言本身没有明晰的某些特性的行为,同时还明确了C语言中与具体机器相关
的一些特性。
附录A
是一个参考手册,是对ANSI C标准进行了概述,是为了帮助程序员更好的理解语言本身(其本身并不能起到标准的作用)。附录B
是对标准库提供的功能
进行了总结。附录C
是对ANSI C标准相较于之前的版本所做的变更
进行了小结。
C语言是一种通用的程序设计语言
。它同UNIX之间具有非常密切的联系——C语言是在UNIX系统上开发的,或者说为了改写UNIX而创造了C语言。由于C语言很适合用来编写编译器
和操作系统
,因此被称为“系统编程语言
”。
C语言提供的基本类型
包括字符
、整型
和浮点型
,同时还有非基本类型指针
、数组
、结构体
和联合体
。而且这些类型之间可以进行派生操作
。
表达式
是由运算符
(operator)和操作数
(operand)组成的。任何一个表达式都可以是一个语句
。指针提供了与具体机器无关
的地址算术运算。
终止测试在顶部
的循环(while、for),终止测试在底部
的循环(do)。
函数可返回基本类型
、结构体
、联合体
或指针类型的值
(不包括数组
)。任何函数都可以递归调用
。
函数定义可以不是嵌套的,但可以用块结构的方式声明变量。
一个C语言程序的不同函数可以出现在多个单独编译
的不同的源文件中。变量可以只在函数内部有效,也可以在函数外部但仅在一个源文件中有效,还可以在整个程序中都有效。
编译的预处理阶段
将对程序文本
进行宏替换
、包含其他源文件
以及进行条件编译
。
C语言本身
不提供直接处理诸如字符串
、集合
、列表
或数组
等复合对象
的操作。除了由函数的局部变量提供的静态定义和堆栈外,C语言本身没有定义任何存储器分配工具
,也不提供堆和无用的内存回收工具
。
C语言本身只提供简单的单线程控制流
。C语言的多线程控制
要通过调用库函数
或操作系统的系统调用
来实现
ANSI C相较于之前版本最重要的变化是函数声明和定义的新语法
。现在,函数的声明中可以包含描述函数实际参数的信息
;相应的,定义的语法也做了改变。这个特性使得编译器很容易检测到因参数不匹配
而导致的错误。
ANSI C标准库
与UNIX系统的“标准I/O库
”很相似。其实ANSI C标准库的实现与具体的操作系统有很大的关联。
由于大多数计算机本身就直接支持C语言提供的数据类型和控制结构,因此只需要一个很小的运行时库
就可以实现自包含程序
。
ANSI C标准明确地提出了可移植性问题,并预设了一个常量的集合
,借以描述运行程序的机器的特性。
ANSI C的类型检查机制
已经得到了加强。ANSI C标准要求对变量进行正确的声明
和显式的强制类型转换
(针对于不兼容的数据类型之间的转换,类型提升除外)。
标准库提供了一个与操作系统交互的公共接口
。该函数库是由ANSI C定义的,这就意味着所有支持C语言的机器都会支持它。因此,使用该库执行输入、输出或其他访问操作系统的操作的程序可以不加修改的运行在不同的机器上。