C语言早期发展【该部分为网友所写(拷贝)】
1969-1973年在美国电话电报公司(AT&T)贝尔实验室开始了C语言的最初研发。根据C语言的发明者丹尼斯·里奇 (Dennis Ritchie) 说,C 语言最重要的研发时期是在1972年。
说明:丹尼斯·里奇(Dennis Ritchie),C语言之父,UNIX之父。1978年与布莱恩·科尔尼干(Brian Kernighan)一起出版了名著《C程序设计语言(The C Programming Language)》,现在此书已翻译成多种语言,成为C语言方面最权威的教材之一。2011年10月12日(北京时间为10月13日),丹尼斯·里奇去世,享年70岁。
C语言之所以命名为C,是因为C语言源自Ken Thompson发明的 B语言,而B语言则源自BCPL语言。
C语言的诞生是和UNIX操作系统的开发密不可分的,原先的UNIX操作系统都是用汇编语言写的,1973年UNIX操作系统的核心用C语言改写,从此以后,C语言成为编写操作系统的主要语言。
K&RC
1978年,丹尼斯·里奇(Dennis Ritchie)和布莱恩·科尔尼干(Brian Kernighan)出版了一本书,名叫《The C Programming Language》(中文译名为《C程序设计语言》)。这本书被C语言开发者们称为“K&R”,很多年来被当作C语言的非正式的标准说明。人们称这个版本的C语言为“K&R C”。
1988年丹尼斯·里奇(Dennis Ritchie)和布莱恩·科尔尼干(Brian Kernighan)修改此书,出版了《The C ProgrammingLanguage》第二版,第二版涵盖了ANSI C语言标准。第二版从此成为大学计算机教育有关C语言的经典教材,多年后也没再出现过更好的版本。
ANSIC 和 ISO C
1970到80年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本。
为统一C语言版本,1983年美国国家标准局(American National StandardsInstitute,简称ANSI)成立了一个委员会,来制定C语言标准。1989年C语言标准被批准,被称为ANSIX3.159-1989 "Programming Language C"。这个版本的C语言标准通常被称为ANSI C。又由于这个版本是 89 年完成制定的,因此也被称为 C89。
后来 ANSI 把这个标准提交到 ISO(国际化标准组织),1990年被ISO 采纳为国际标准,称为 ISO C。又因为这个版本是1990年发布的,因此也被称为C90。
ANSI C(C89) 与 ISO C(C90)内容基本相同,主要是格式组织不一样。
因为 ANSI 与 ISO 的C标准内容基本相同,所以对于C标准,可以称为ANSI C,也可以说是ISO C,或者ANSI / ISO C。
注意:以后大家看到 ANSI C、ISO C、C89、C90,要知道这些标准的内容都是一样的。
目前,几乎所有的开发工具都支持 ANSI/ ISO C 标准。是C语言用得最广泛的一个标准版本。
C99
在ANSIC标准确立之后,C语言的规范在很长一段时间内都没有大的变动。1995年C程序设计语言工作组对 C语言进行了一些修改,成为后来的1999年发布的 ISO/IEC 9899:1999标准,通常被成为C99。
但是各个公司对C99的支持所表现出来的兴趣不同。当GCC和其它一些商业编译器支持C99的大部分特性的時候,微软和Borland却似乎对此不感兴趣。
说明:GCC(GNU CompilerCollection,GNU编译器集合)是一套由GNU工程开发的支持多种编程语言的编译器。
综上所述,目前广泛使用的C语言版本是 ANSI / ISO C,最经典的C语言教材是《C程序设计语言(The C Programming Language) 第二版》。
很多编程语言都深受C语言的影响,比如C++(原先是C语言的一个扩展)、C#、Java、PHP、Javascript、Perl、LPC和UNIX的C Shell等。
也正因为C语言的影响力,掌握C语言的人,再学其它编程语言,大多能很快上手,触类旁通,很多大学将C语言作为计算机教学的入门语言。
一:判断明白我的gcc和vc6.0的支持的C版本:【个人见解】
1,我的GCC支持的C版本:#include <stdbool.h>: 该文件(可以直接使用布尔型)为C99标准(C99之前的ANSI C等均是不支持的),在我的PC的ubuntu下的gcc是可以编译的,故我的gcc至少遵循C99标准(较新版本)。
2,我的window下的vc6.0支持的C版本:
先在vc6.0写一段代码:
#include<stdio.h>
void main(void)
{
int i;
printf("Hello World/n");
int j;
}
B编辑完后将该代码文件存成了test.c(注意是.C文件)
然后编译的时候出现了error,error C2143: syntaxerror : missing ';' before 'type'
感觉很奇怪,细细看来所有的语法都似乎都是对的,更奇怪的是把文件改成cpp或者cc能正常编译,把int a;和if调换下也能正常编译。
原因:【先明白一点在K&R C中规定:当变量的声明放在可执行代码之后,被只支持K&R C的编译器认为是非法的,即出现了上述的错误,但在ANSI C中是把这种规则废除了的,即支持变量的声明放在可执行代码之后(方便C与C++兼容)】
将该代码文件改成.cpp或者.cc能正常编译,说明visual c++6.0的.CPP文件支持ANSIC(一个广泛使用的标准)。但是保存为.c文件就会出错,说明Visual c++ 6.0的.c文件确只支持K &R C版本(该版本让用户将变量放在可执行代码的后面可能是为了:变量名的最迟绑定有利于增加代码的可读性等)。
但是,当在VC6.0(.cpp)添加头文件:<stdbool.h>时,编译器说找不到的,说明VC6.0并不完全支持最新的C99;再次测试时,发现VC6.0(.cpp)文件支持bool(占一个字节),false,true,等关键字,但这些都是ANSI C标准所没有的,说明我这个对.cpp文件代码进行编译的编译器VC6.0值支持的标准超过了ANSIC,但没有达到C99标准。标准已经出来,编译器跟不上(或者编译器出来,标准跟不上)就是这样的情况。
总结我PC上的编译器支持的C版本排序:
排序: VC6.0(.c文件)->VC6.0(.cpp或者.cc文件)->gcc
对应C版本: K&R C —>(ANSIC—C99)———>C99
(注:逻辑不严谨,但是大致如此,给在VC6.0与gcc之间简单的正确移植C程序作参考够了)
二:结论
(1)在ubuntu上由gcc编写的代码移植到VC6.0(.cpp)需要降个等级(从C99->ANSIC)。即:直接拷贝到VC6.0的.cpp文件中,直接编译,按错误提示直接修改即可(有时需要参考C99与ANSIC的标准差别)。
(2)在VC6.0的.c编辑代码就算了,为什么不依据广泛使用的ANSIC标准(实际情况是已超过这个标准)在.cpp编辑呢!但是,K&R C标准规定的变量声明必须放在可执行代码前面,这个规则非常好(i:变量名的最迟绑定有利于增加代码的可读性;ii:万一代码真需要在仅支持K&R C的编译器上中编译呢)。
补判断VC6.0支持C版本的参考办法:(查看方法:安装目录F:xxxx\ VC98\INCLUDE有各种头文件,可查看文件的开头来查看其支持的C版本(文件编写时间与ANSIC版本制定公布的时间进行比较)