C语言的发展与版本-标准

C语言版本发展

【K&R C】

1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了《The C Programming Language》的第一版(按照惯例,经典著作一定有简称,该著作简称为 K&R),书末的参考指南 (Reference Manual) 一节给出了当时 C 语言的完整定义,成为那时 C 语言事实上的标准,人们称之为 K&R C。从这一年以后,C 语言被移植到了各种机型上,并受到了广泛的支持,使 C 语言在当时的软件开发中几乎一统天下。

【C89 (ANSI C)】

随着 C 语言在多个领域的推广、应用,一些新的特性不断被各种编译器实现并添加进来。于是,建立一个新的“无歧义、于具体平台无关的 C 语言定义” 成为越来越重要的事情。1983 年,ASC X3(ANSI 属下专门负责信息技术标准化的机构,现已改名为 INCITS)成立了一个专门的技术委员会 J11(J11 是委员会编号,全称是 X3J11),负责起草关于 C 语言的标准草案。1989 年,草案被 ANSI 正式通过成为美国国家标准,被称为 C89 标准

【C90 (ISO C)】

随后,《The C Programming Language》第二版开始出版发行,书中内容根据 ANSI C(C89)进行了更新。1990 年,在 ISO/IEC JTC1/SC22/WG14 (ISO/IEC 联合技术第 I 委员会第 22 分委员会第 14 工作组) 的努力下,ISO 批准了 ANSI C 成为国际标准。于是 ISO C(又称为 C90) 诞生了。除了标准文档在印刷编排上的某些细节不同外,ISO C(C90) 和 ANSI C(C89) 在技术上完全一样。

【C95】

之后,ISO 在 1994、1996 年 分别出版了 C90 的技术勘误文档,更正了一些印刷错误,并在1995 年通过了一份 C90 的技术补充,对 C90 进行了微小的扩充,经过扩充后的 ISO C 被称为 C95。

【C99】

1999 年,ANSI 和 ISO 又通过了最新版本的 C 语言标准和技术勘误文档,该标准被称为 C99 。这基本上是目前关于 C 语言的最新、最权威的定义了。

C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准。

现在,各种 C 编译器都提供了 C89(C90) 的完整支持,对 C99 还只提供了部分支持,还有一部分提供了对某些 K&R C 风格的支持。

目前主要的C语言规范有c89(c90), c95(94)和c99。C89是最早的C语言规范,于89年提出,90年先由美国国家标准局推出ANSI版本,后来被接纳为ISO国际标准 (ISO/IEC 9899:1990),因而有时也称为c90。但在94和96年分别对c90进行了两次错误修正,gcc支持的是修正后的c89(90)版本的C语言规范。在95年提出过对90版规范的修订案,称为 C95或者AMD1。gcc也支持c95规范。最新的一次C规范修订在99年制定(ISO/IEC 9899:1999),即常称的C99规范。在2001年对C99的错误进行了修正,gcc支持的修正后的c99规范,但是到目前为止,gcc还没有完成对c99规范的完全支持。

具体代码测试方法

通过版本差异,测试出编译器执行标准

one 判断是否是C89,如果下面程序不能运行则是C89,否则至少是C99

#include <stdio.h>

int main(void)
{
 // C99允许在for循环内定义循环变量,而C89不允许
 for (int i = 0; i < 5; i++)    
 {
   printf("hello world!\n");
 }

   return 0;
}

two 看看是否支持_Bool

C99新增_Bool类型

//C99.c
#include <stdio.h>
#include <stdint.h>

int main(void)
{
    // C90
    signed int a = -10;
    printf("a=%d\n", a);

    // C99
    _Bool b = 1;
     if (b)
     {
         printf("b is true.\n");
     }
     else{
         printf("b is false\n");
     }
     
    return 0;
}

three

在C89中变量必须在文件的开头被定义否则无法被使用

#include <stdio.h>

int main()
{	//下面需要解决的是,时差之间的分钟借位问题。
	int hour1, minute1;
	int hour2, minute2;
	int ih,im;
	scanf_s("%d%d",&hour1,&minute1);
	scanf_s("%d%d",&hour2,&minute2);
	ih=hour2-hour1;
	im=minute2-minute1;
	//如果int a写在这些语句的后面,VSC++2010会报错。!!!应该是先定义,后使用。
	int a;
	
	
	return 0;
}

网络参考资料

C/C++标准发展史(整理)
C 如何判断编译器是否支持C90 C99?测试
(26条消息) C语言 | 什么是ANSI C标准?_嵌入式大杂烩的博客-CSDN博客_ansi c

posted @ 2022-07-05 22:59  Development_UP  阅读(527)  评论(0)    收藏  举报