1989 年,草案被 ANSI 正式通过成为美国国家标准,被称为 C89 标准。 【C90 (ISO C)】 随后, 《The C Programming Language》第二版开始出版发行,书中内容根据 ANSI C(C89)进行了更新。 除了标准文档在印刷编排上的某些细节不同外,ISO C(C90) 和 ANSI C(C89) 在技术上完全一样。 现在,各种 C 编译器都提供了 C89(C90) 的完整支持,对 C99 还只提供了部分支持,还有一部分提供了对某些 K&R C 风格的支持。 目前主要的C语言规范有c89(c90), c95(94)和c99。
1989年,草案被ANSI 正式通过成为美国国家标准,被称为C89 标准。 3、ISOC(C90) 随后,《TheC Programming Language》第二版开始出版发行,书中内容根据ANSI C(C89)进行了更新。 除了标准文档在印刷编排上的某些细节不同外,ISOC(C90) 和ANSI C(C89) 在技术上完全一样。 目前主要的C语言规范有c89(c90),c95(94)和c99。 从第2点来看,刚开始ANSI制定了C标准,这一制定就耗费了6年时间,终于在89年发布了,所以就叫C89标准了,也就是我取名的C标准1; 从第3点来看,在90年的时候,ISO等组织采纳了C89标准,然后做了一些修改再发布
我们在很多地方都有看到过K&R C、ANSI C、ISO C、C89、C99、C11等标准,具体有什么不同呢?(文末有个很好的实例) 什么是K&R C? 什么是ANSI C、ISO C、C89、C90标准? 随着C语言使用得越来越广泛,出现了许多新问题,人们日益强烈地要求对C语言进行标准化。 经过漫长而艰苦的过程,该标准于1989年完成,这个版本的语言经常被称作ANSI C,或有时称为C89(为了区别C99)。 综上,ANSI C、ISO C、C89、C90其实是同一种标准。 什么是C99标准? 2000年3月,ANSI采纳了 ISO/IEC 9899:1999 标准。这个标准通常指C99。 \n"); } return 0; } 在C89标准下编译,结果为: ? 编译报错原因为,在C89标准下,循环变量不能在for循环内定义,必须把标准改为C99标准才可正常编译。
从gnu的手册中,可以看到-ansi等同于-std=c89,而c89那个年代,是不支持双斜线的 ? 问题找到了,怎么解决呢?最简单粗暴的办法就是 -- 删了它! ? 再编译一下试试 ? 原来删除-ansi后,IDE就会将规则重置为-std=gnu89,而正是gnu89对c89做了一些扩展,其中就包含了这个双斜线注释。 不过,毕竟和c89相比,c99的变化太多,编译规则改动太大,可能会涉及到代码移植或兼容的问题,这就需要项目经理或技术负责人来统筹定制规则了。 原来是厂家专门做的改进,就像是gnu89对c89的改进。 ? 看看它改进了哪些,果然有这一条 ? 好,到此为止,都搞定了! 这正是: 编译工具规则多,代码注释有风格。
C语言标准C语言从其诞生至今,经历了多个标准的更新,主要标准包括:C89/C90 (ANSI C / ISO/IEC 9899:1990):这是C语言的第一个官方标准,由ANSI于1989年发布,后被ISO C89标准(也称为C90标准)C89是C语言的第一个官方国际标准,正式名称为ISO/IEC 9899:1990。 它是在1989年由美国国家标准协会(ANSI)制定并发布的,故得名C89,随后在1990年被国际标准化组织(ISO)采纳,成为国际标准。 C89标准定义了C语言的基础语法、关键字、数据类型,并引入了标准库函数,比如stdio.h和stdlib.h等,确立了C语言的基本形态。 它是C89标准的后续版本,引入了许多新特性和改进,旨在适应不断发展的编程需求和技术环境。
void test1(void); // 测试函数1:交换a,b的值 void test2(void); // 测试函数2:C语言预定义宏 void test3(void); // 测试函数3:C89 b的值 case 2 : test2(); break; // 测试函数2:C语言预定义宏 case 3 : test3(); break; // 测试函数3:C89 当前编译时间:%s\n", __TIME__); printf("当前文件名称:%s\n", __FILE__); printf("当前函数名称:%s\n", __FUNCTION__); } /* C89 与C99标准的区别 */ void test3(void) { int i; system("cls"); // C99允许在for循环内定义循环变量,而C89不允许 // gcc -std=c99 ====================\n"); printf("[01]测试:交换a,b的值\n"); printf("[02]测试:C语言预定义宏\n"); printf("[03]测试:C89
C89 / ANSI C 1989年,由ANSI发布,32个 auto break case char const continue default do double else enum extern register return short signed sizeof static struct switch typedef union unsigned void volatile while C89
但在GNU C下有点小特殊,使用gcc -std=c89编译上述代码,发现也是OK的!原来,变长数组在c89中是作为GNU C的一个扩展存在的。
这种非预测性bug发生的原因是,C89中没有“在循环中声明变量”。 但是,由于内核停留在C89标准上,因此无法在循环中声明变量。 Linus决定,那咱们还是升级吧,也许是时候转向C99标准了。 虽然它也有20多年的历史,但至少比C89新,可以在循环中声明变量。 既然C89如此陈旧,这么多年还没做出改变呢?Linus说,那是因为我们在一些古老的gcc编译器版本中遇到了一些奇怪的问题,不能随便升级。
以 C 语言为例,发展至今该编程语言已经迭代了诸多个版本,例如 C89(偶尔又称为 C90)、C94(C89 的修订版)、C99、C11。
《标准修正案一》在1994年为C语言创建了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广的国际字符集支持。不过,这个标准引出了1999年ISO 9899:1999的发表。 支持 // 开头的单行注释(这个特性实际上在C89的很多编译器上已经被支持了) 增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool 支持 long 修改了 / % 处理负数时的定义,这样可以给出明确的结果,例如在C89中-22 / 7 = -3, -22 % 7 = -1,也可以-22 / 7= -4, -22 % 7 = 6。
9.2 数据类型 了解数据类型之前要对ANSI C和ISO C的发展史有个了解,特别是C89,C99和C11的由来。 因为这个标准是1989年发布的,所以一般简称C89标准。有些人也把C89标准叫做ANSI C。 在1990年,ANSI C89标准被国际标准化组织(ISO)和国际电工委员会(IEC)采纳为国际标准,名叫ISO/IEC 9899:1990 - Programming languages C,有些人简称 因此,C89和C90通常指同一个标准,一般更常用C89这种说法。 对于我们常用的编译器MDK和IAR而已,C89,C99和C11均支持。
###C89和C90 1983年,美国国家标准协会组成了一个委员会,X3J11,为了创立 C 的一套标准。 这个版本的语言经常被称作"ANSI C”,或有时称为"C89"(为了区别C99)。 在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会采纳为ISO/IEC 9899:1990。 因此,C89和C90通常指同一种语言。
其实这种写法使用现在的编译器编译时会警告,但查了一下在C89标准中是可以的,而且由于函数没有显式声明返回类型那么编译器会将返回值默认为int的缘故,其返回值也为int。 查了C89/C99/C11相关文档,都没有提到任何这种写法的痕迹,我见过最多的写法就是这种,不清楚为什么有这么多初学者这么写。严格来说返回值为void是不正确的。 其实官方标准已经给出了这个问题的答案,C89/C99/C11标准文档中只提供了以下两种main函数的写法: int main(void) int main(int argc, char *argv[]
小明是一名嵌入式软件工程师,他擅长C语言和C++编程,现在需要在一款提供C++和C89编译器的4KB RAM 硬件设备上进行程序开发,他觉得C++有下面这些好用的特性: C++支持inline函数,它比 小明还有理由坚持只使用C89进行程序开发吗? 还有理由坚持只使用C89进行程序开发吗? 讨论 对于资源有限,比如RAM只有4KB的设备,我通常在正式开发C语言程序之前,会先写一些样例试水。
1989年,ANSI发布了第一个完整的C语言标准: ANSI X3.159--1989,简称“C89”,不过人们也习惯称其为“ ANSI C”。 C89在1990年被ISO(国际标准化组织)采纳并命名为ISO/IEC 9899,简称为“C90”。
image.png 附录 参考资料: C语言的各种版本:C89,AMD1,C99,C11
C语言的最早标准版本--C89(也称为C90) 全称:ANSI X3.159-1989(ANSI C),ISO/IEC 9899:1990(C90)。 C89的特点是简洁、可移植且易于理解,被广泛应用于各种计算机平台。 3. C99 全称:ISO/IEC 9899:1999。 背景:1999年发布,是C语言的第三个标准版本。 C89 ANSI X3.159-1989 美国国家标准协会(ANSI) 1989年 基于早期的K&R C语言 定义了C语言的核心语法、数据类型和标准库函数等基本要素 C90 ISO/IEC 9899:1990 国际标准化组织(ISO)和国际电工委员会(IEC) 1990年 C语言的首个官方标准,基本上是对C89标准的复制,加入了一些额外的细节 与C89标准几乎完全相同,做了一些小的改进和澄清 C95 ISO
一开始我以为是使用的编译器的标准不同,因此尝试着使用c89,c90,c99,c11编译程序,使用c89和c90时, 编译器还是没有报任何错误,而使用c99和c11时,会报下面的警告: test.c:
《标准修正案一》在1994年为C语言创建了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广的国际字符集支持。不过,这个标准引出了1999年ISO 9899:1999的发表。 支持 // 开头的单行注释(这个特性实际上在C89的很多编译器上已经被支持了) 增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool 支持 long 修改了 / % 处理负数时的定义,这样可以给出明确的结果,例如在C89中-22 / 7 = -3, -22 % 7 = -1,也可以-22 / 7= -4, -22 % 7 = 6。