C语言标准

C语言标准


 写在前面:K&R C不用说。个人以为,我们平常说的标准C,指的是ANSI C,ISO C,C89,C90。


K&R C


  1978年,丹尼斯•里奇(Dennis Ritchie)和布莱恩•柯林汉(Brian Kernighan)合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程式设计师称作“K&R C”,第二版的书中也包含了一些ANSI C的标准。K&R C主要介绍了以下特色: 

  • 结构(struct)类型
  • 长整数(long int)类型
  • 无符号整数(unsigned int)类型
  • 把运算符=+和=-改为+=和-=。因为=+和=-会使得编译器不知道使用者要处理i = -10还是i =- 10,使得处理上产生混淆。

  即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最低标准要求,许多老旧的编译仍然运行K&R C的标准。

ANSI C和ISO C


  C 的第一个标准是由ANSI发布的。虽然这份文档后来被国际标准化组织(ISO)采纳并且ISO发布的修订版也被ANSI采纳了,但名称ANSI C(而不是 ISO C)仍被广泛使用。ANSI C现在被几乎所有广泛使用的编译器支持。现在多数C代码是在ANSI C基础上写的。

C89和C90

  1983年,美国国家标准协会组成了一个委员会,X3J11,为了创立 C 的一套标准。经过漫长而艰苦的过程,该标准于1989年完成,并在作为ANSI X3.159-1989 "Programming Language C"正式生效。这个版本的语言经常被称作"ANSI C",或有时称为"C89"(为了区别C99)。 在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会采纳为ISO/IEC 9899:1990。这个版本有时候称为C90或者ISO C。因此,C89和C90通常指同一种语言。 传统C语言到ANSI/ISO标准C语言的改进包括:

  • 增加了真正的标准库  
  • 新的预处理命令与特性  
  • 函数原型允许在函数申明中指定参数类型  
  • 一些新的关键字,包括 const、volatile 与 signed  宽字符、宽字符串与字节多字符  
  • 对约定规则、声明和类型检查的许多小改动与澄清

C99

  2000年3月,ANSI 采纳了 ISO/IEC 9899:1999 标准。这个标准通常指C99。 C99新增了一些特性,如:  

  • 支持不定长的数组,即数组长度可以在运行时决定。  
  • 变量声明不必放在语句块的开头,for 语句提倡写成 for(int i=0;i<100;++i) 的形式,即i 只在 for 语句块内部有效。  
  • 初始化结构的时候允许对特定的元素赋值。  
  • 允许编译器化简非常数的表达式。
  • 取消了函数返回类型默认为 int 的规定。

  但是各个公司对C99的支持所表现出来的兴趣不同。当GCC和其它一些商业编译器支持C99的大部分特性的时候,微软和Borland却似乎对此不感兴趣,他们把更多的精力放在了C++上。

C11

  在2011年12月,ANSI 采纳了 ISO/IEC 9899:2011 标准。这个标准通常即C11,它是C程序语言的最新标准。


解读《C标准库》——下载链接:http://pan.baidu.com/share/link?shareid=1709750569&uk=3392170639&fid=4263874501

  C 标准库》告诉我们如何使用符合 语言的 ANSI/ISO 标准的库函数 。还告诉你我们 标准库是如何实现的 。本书提供了大约 9000 行测试过的可实际工作的代码 。我相信,看了 标准库的实现细节后我们能更好地理解如何使用它 。

  库函数的实现代码尽可能地使用标准 C这样做有 个设计目的: 首先它使代码具有可读性和示范性;其次,它使代码在各种计算机体系结构间具有高度可移植性 ;最后 ,它能使编写的代码兼顾正确性 性能和规模各方面 


 C 标准库

  C 标准库是非常强大的,它在多种不同的环境下提供了相当多的功能:它允许用户和实现者使用明确定义的名字空间;它对其所提供的数学函数的健壮性和精确性有非常严格的要求;它率先对适应不同文化习惯的代码提供支持,包括那些拥有很大字符集的文化习惯。

  为了能有效利用标准库所提供的强大功能,用户应该了解其实现上的很多隐晦细节。库的实现者必须向用户提供这些细节,以使他们更好地使用标准库。C 标准中并没有把这些隐晦的实现细节都很好地描述清楚 , 因为制定标准的主要目的并不是给库的实现者提供指导 。 与 ANSI C 标准一起发布的 Rationale 也没有对这些细节作出很好的解释。Rationale 要服务的对象范围很广,而关注这些细节的标准实现者只是众多服务对象的一部分。

  在 C 的传统实现中并不能找到上面提到的新特性 。 现在的实现已经可以支持国际化开发中的 区域设置 (locale)概念。每个区域设置都对应于专属的某个国家、 某种语言或者某个职业的特定习惯,一个 C 程序可以通过修改和查询区域设置来动态地适应多种文化。现在的实现也能支持很大的字符集,如字符数量众多的汉字。C 程序能把它们作为 多字节字符(multibyte character )或者 宽字节字符(wide character)处理。它也能在这两种形式之间转换。在迅速加剧的市场竞争中,这就使得程序的编写更加简单和标准。

  因为以前对这些新特性几乎不存在相应的编程艺术 ,所以即使是最有经验的 C 程序员 , 在使用区域设置 、 多字节字符和宽字节字符的时候也需要一些指导 。所以 ,这些主题在这里给予了特殊的关注 。


原文地址:https://www.cnblogs.com/xymqx/p/3712501.html