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
这种非预测性bug发生的原因是,C89中没有“在循环中声明变量”。 但是,由于内核停留在C89标准上,因此无法在循环中声明变量。 Linus决定,那咱们还是升级吧,也许是时候转向C99标准了。 虽然它也有20多年的历史,但至少比C89新,可以在循环中声明变量。 既然C89如此陈旧,这么多年还没做出改变呢?Linus说,那是因为我们在一些古老的gcc编译器版本中遇到了一些奇怪的问题,不能随便升级。
但在GNU C下有点小特殊,使用gcc -std=c89编译上述代码,发现也是OK的!原来,变长数组在c89中是作为GNU C的一个扩展存在的。
以 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标准中是可以的,而且由于函数没有显式声明返回类型那么编译器会将返回值默认为int的缘故,其返回值也为int。 查了C89/C99/C11相关文档,都没有提到任何这种写法的痕迹,我见过最多的写法就是这种,不清楚为什么有这么多初学者这么写。严格来说返回值为void是不正确的。 其实官方标准已经给出了这个问题的答案,C89/C99/C11标准文档中只提供了以下两种main函数的写法: int main(void) int main(int argc, char *argv[]
###C89和C90 1983年,美国国家标准协会组成了一个委员会,X3J11,为了创立 C 的一套标准。 这个版本的语言经常被称作"ANSI C”,或有时称为"C89"(为了区别C99)。 在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会采纳为ISO/IEC 9899:1990。 因此,C89和C90通常指同一种语言。
小明是一名嵌入式软件工程师,他擅长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。