C语言由Dennis M.Ritchie在1973年设计和实现。从那以后使用者逐渐增加。到1978年Ritchie和Bell实验室的另一位程序专家Kernighan合写了著名的《TheC ProgrammingLanguage》,将C语言推向全世界,许多国家都出了译本,国内有一些C语言书就是这本书的翻译或者编译。由这本书定义的C语言后来被人们称作K&R C。

随着C语言使用得越来越广泛,出现了许多新问题,人们日益强烈地要求对C语言进行标准化。这个标准化的工作在美国国家标准局(ANSI)的框架中进行(1983-1988),最终结果是1988年10月颁布的ANSI标准X3.159-1989,也就是后来人们所说的ANSIC标准。由这个标准定义的C语言被称作ANSI C。

ANSI C标准很快被采纳为国际标准和各国的标准。国际标准为ISO/IEC9899-1990,中国国家标准GB/T 15272-94是国际ISO标准的中文翻译。

ANSIC标准化工作的一个主要目标是清除原来C语言中的不安全、不合理、不精确、不完善的东西。由此也产生了ANSIC与K&RC之间的差异。从总体上看,这些差异反应的是C语言走向完善、走向成熟。

ANSI C 对 K&R C 的修订

(本段根据《C ProgrammingLanguage》和C语言标准整理。不求完整,希望列出最常见的差异)

 

 

1. 对于源文件内部的标识符,有效的最小长度扩充到31个字符。文件间连接时,标识符的最小有效长度仍然为6个字符。(许多实现都支持更大的长度)

2. 增加了几个新关键字:void,const,volatile,signed,enum。抛弃了老关键字entry。

3. 在换意字符 \ 之后写非规定的序列,其作用确定为无定义。

4. 规定8和9都不是八进制数的合法字符。

5. 引进了数的后缀字符:整数的U和L,浮点数的F和L。

6. 规定连续出现的字符串常量将被拼接在一起。

7. 引进了“宽字符”的概念。

8. 将字符也确定为带符号(signed)和不带符号(unsigned)的。

9. 丢弃了long float(原来作为double的同义词)。

10. 引入了void类型,用 (void*)表示通用指针的类型(过去人们通常用 (char*))。

11. 对算术类型规定了最小表示范围。要求每个C语言系统用头文件(<limits.h>和<float.h>)说明实现中的具体规定。

12. 引进了枚举定义enum。

13. 采用了来自C++的类型修饰符,如const。

14. 规定字符串常量是不可修改的。

15. 改变了算术类型的隐含转换规则。

16. 删去了一些过时赋值运算符,如 =+。规定赋值运算符都是基本单词,如+= 之间不能有空格分隔。

17. 引进了与一元 - 运算符对应的一元 + 运算符。

18. 指向函数的指针可以直接放在函数调用的位置,不必显式地写间接操作。

19. 允许结构地整体赋值,作为函数参数和返回值传递。

20. 允许将取地址运算符作用于数组,得到的是指向有关数组的指针。

21. 标准规定 sizeof 运算符的返回值为 size_t类型(某个无符号整型),这一类型在标准头文件<stddef.h>里定义。同时在那里定义的还有ptrdiff_t 类型,它是指针减运算的结果类型。

22. 规定取地址运算符不能作用于 register 变量。

23. 规定移位表达式的类型为其左运算对象的类型。

24. 允许建立指向过数组末元素一个位置的指针,以及对它的算术运算和关系运算。

25. (从C++)引进了包含参数类型的函数原型概念,引进了变长参数表函数的概念。仍允许老的形式,但仅仅是作为过时形式保留。

26. 标准规定任何局部声明的作用域仅仅是当前的块(复合语句)。

27. 规定函数参数作为加入函数体(复合语句)的声明,因此不能用变量声明去覆盖。

28. 有关名字空间的规定:所有结构、联合和枚举标记在一个名字空间里,标号是另一个名字空间。

29. 联合变量在定义时也可以初始化,规定初始化其第一个成分。

30. 自动结构、联合和数组也可以初始化,但限制其初始化方式(其中只能包含常量表达式)。

31. 带大小描述的字符数组也可以用大小与之相同的字符串常量初始化(结束的\0 被删除)。

32. 开关语句的控制表达式和case标号可以是任何整型的(包括字符类型)。

 

大部分的关于C的著作都提到ANSI CStandard,但我相信少有C程序员真正细致阅读过ANSIC标准(当然了对于作C编译器的程序员来说这个标准肯定是烂熟于胸了^_^),在这个系列的文章中我将和大家一起浏览一下ANSIC标准(C99,以下称标准),呵呵,当然也不能面面俱到,只是“走马观花”。

1. 什么是“标准”(这里指编程语言标准)

按照comp.lang.c的CFAQ的意思:“标准只是把现存的实践整理成文。编程语言标准可以看作语言使用者和编译器实现者之间的协议。协议的一部分是编译器实现者同意提供,用户可以使用的功能。而其它部分则包括用户同意遵守,编译器实现者认为会被最受的规则。只要双方都恪守自己的保证,程序就可以正确运行。如果任何一方违背它的诺言, 则结果肯定失败。

2. ANSI C Standard到底讲了啥?

这就是标准中"Scope"一节所要讲述的问题。按照标准说明:标准详细说明了使用C语言书写的程序的形式,规范对这些程序的解释。包括:

-- C程序的表示法;

-- C语言的语法和约束;

-- 解释C程序的语义规则;

-- C程序输入和输出的表示;

-- 一份标准的实现的限定和约束。

3、有关标准中所用术语的解释

在标准的第3章列出了标准中所用的一些难解的术语、定义和符号。我想这些术语用英文解释应该更为精确,建议在看标准前认认真真的看一遍这些术语。有些术语解释第的确确让我弄清了我以前的一些疑惑。

4、“走马观花ANSI C标准”将按照ANSI C标准的章节分为:

Season1 -- 环境

Season2 -- 语言

Season3 -- 库

ANSI C 与 K&R C的更多相关文章

  1. K&R C风格函数

    前些天在看getopt源码, 一种前所未见的函数定义方法 int getopt(nargc, nargv, ostr) int nargc; char * const nargv[]; const c ...

  2. 学习K&R时初学者经常遇到的一个问题——EOF

    学习K&R时初学者经常遇到的一个问题——EOF

  3. 编程语言教程书该怎么写: 向K&R学习!

    原文地址:Lax Language TutorialsAndrew Binstock 每年在评审Jolt Awards图书的时候,我都会被一些语言教程类图书弄得心力交瘁.从这些年的评审经验来看,这些语 ...

  4. K&R《C语言》书中的一个Bug

    最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...

  5. 《C程序设计语言》(K&R)中文高清非扫描件

    <C程序设计语言>(K&R)中文高清非扫描件(带书签目录) 对于某下载东西都要C币的网站无爱了.好不容易找了一个,发出来看会不会帮到别人   附上addr:https://pan. ...

  6. 《K&R》中引用的几个排序算法(shellsort、)以及一个自己乱写的排序

    留待期末考后更新... void shellsort(int v[], int n) { int gap, i, j, temp; ; gap > ; gap /= ) for(i = gap; ...

  7. 《K&R》里贯穿全书的代码

    个人阅读<K&R>的感觉就是:前后内容联系特别紧密,前面的代码没有理解好到了后面就看不下去. 1.getline(char s[], int lim) 调用结果:往参数数组中读入字 ...

  8. C程序设计语言(K&R)笔记

    1.表达式中float类型的操作数不会自动转换为double类型.一般来说,数学函数(如math.h)使用双精度类型的变量.使用float类型主要是为了在使用较大数组时节省存储空间,有时也为了节省机器 ...

  9. (经典) K&R的名著<<C程序设计语言>>二分查找

    #include<stdio.h> //查找成功则返回所在下标否则返回-1 int binsearch(int A[], int n,int a) { int low, high, mid ...

随机推荐

  1. 基于 Laravel Route 的 ThinkSNS+ Component

    这里是传送门: <ThinkSNS+ 基于 Laravel master 分支,从 1 到 0,再到 0.1[ThinkSNS+研发日记系列一]> <基于 Laravel 开发 Th ...

  2. linux 查看系统版本号(转)

    一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [root@localhost ~]# cat /proc/versionLinux version 2.6.18 ...

  3. MySQL创建用户+授权+备份

    ======权限管理====== 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.update.grant等操作. 那么一般情况在公司 ...

  4. ES6新特性使用小结(一)

    一.let const 命令 'use strict'; /*function test(){ //let a = 1; for(let i=1;i<3;i++){ console.log(i) ...

  5. Hive_Hive的数据模型_视图

    - 视图是一种虚表,是一个逻辑概念:可以跨越多张表- 视图建立在已有表的基础上,视图赖以建立的这些表称为基表.- 视图可以简化复杂的查询. 创建视图 create view viewName as s ...

  6. Spring中的注入方式 和使用的注解 详解

    注解:http://www.cnblogs.com/liangxiaofeng/p/6390868.html 注入方式:http://www.cnblogs.com/java-class/p/4727 ...

  7. 洛谷P1781 宇宙总统

    https://www.luogu.org/problem/show?pid=1781 高精比较大小: #include<iostream> #include<cstdio> ...

  8. text-transform字母大小写属性设置

    text-transform: none: 默认  不设置,全是小写 capitalize: 每个单词以大写字母开头 uppercase: 全部是大写字母 lowercase:  全部是小写字母 in ...

  9. [Loading Component]Loading组件的v-model设计是否不合理?

    vue在2.4.2版本中给computed里的属性加了限制,详见assigning to a computed property without setter does not fail 项目将vue ...

  10. It is not the destination so much as the journey, they say.

    It is not the destination so much as the journey, they say. 人家说目的地不重要,重要的是旅行的过程.<加勒比海盗>