论文部分内容阅读
摘要:C 程序良好的可移植性使得C 语言成为程序设计人员的首选工具语言,而保证这一特性必需使用标准化的C 编码。国内高校尤其是高职院校的教材中,存在着大量非标准化的C 程序,不利于培养具有标准化C 编程风格的学生。本文从C 发展史、教育工作者和教材规范化等多个角度出发,分析了这一问题产生的原因,并提出了相应的解决办法。
关键词:C 标准;可移植性;高等教育
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)18-21ppp-0c
1 引言
1983年第一个C 程序投入使用,1994年8月,ANSI/ISO委员会草案登记,这便是业内所称的早期的C 标准,1998年11月,ISO/IEC:98-14882标准(以下简称98标准)被批准,标志着C 代码的标准化正式诞生[1]。C 语言诞生以来,延续了C语言的重要特征,即C 源程序良好的可移植性。正是这一特性,使得C/C 语言长期以来一直是程序开发人员的首选。
C 语言良好的可移植性是它具有较强生命力的关键所在。目前标准委员会正在修订C 标准,并拟于2009年发布修订后的09标准。可以预见,C 语言作为程序开发的主要工具仍将延续很长的一段时间。然而,国内高等教育尤其是高职教育,在C 语言的教学中却长期使用了非标准化的编码方式,这对于学生毕业后从事程序设计,写出具有良好可移植性的程序是相当不利的。
C 程序编码的标准化在互联网的一些论坛里有一些讨论,然而关于现行教材或专著里存在的问题,却鲜有文章进行报道。本文通过讨论现有高校教材尤其是高职教材中C 代码编写方式与现行C 标准的一些距离,试图引导高校教材尤其是高职教材中C 程序编码走向标准化。
2 标准化的目的和意义
标准化之争是信息时代商业竞争乃至国家之间竞争的必争之地。欧美的企业一直依赖都很热衷于标准化之争,UNIX从诞生到现在的各自为政就是一个很好的例子。而IT领域信息技术的高度集中和相对垄断也使得国际标准化组织制定的很多标准并没有被企业所采用,相反地,出现了很多像“Microsoft Windows”、“Internet Explorer”这种“事实上的工业标准”。C 语言从诞生到98标准诞生,花了整整15年的时间,对于发展迅猛的信息技术,这是一个相当漫长的过程。在此期间,国际上一些跨国公司如Microsoft、IBM、Borland(如今的Inprise)相继开发了自己的C 编译器,这些公司的编译器除了包含标准的C 编译器的内容之外,还加入了自己的一些特性,甚至修改了部分标准。一旦程序设计人员使用了这些非标准的特性,代码的可移植性将会成为一个大问题。因此,如何教导学生编写标准化的C 源程序,成为C 语言教学中一个非常重要的问题。
3 C 语言教学中存在的非标准化编码的主要问题
Microsoft公司曾经因为其在软件行业得天独厚的地位,而在MS Visual C 编译器中采使用了很多非标准化的内容。然而,在MS Visual Studio 2005发布之后,Microsoft公司相关人员特别指出该产品的一个重要变化就是完全符合98标准[2]。对于程序员来说,如果他原先在MS Visual C 中使用了非标准化的代码,在移植到MS Visual Studio2005这个平台上时将会花费相当大的精力去修改代码。即便是微软这样一个跨国企业,都不得不向国际标准靠拢,可想而知,标准化对于企业来讲是多么重要了。对于程序员,如何编写标准化的C 代码,保持C 代码的良好可移植性则是重中之重。然而,在我国的高校尤其是高职教材中却存在着甚至是大量存在着非标准化的C 程序,究其原因,笔者认为主要有如下几个方面:
3.1 C语言的影响
这也是最重要的一点。我国高校早期从事C 语言的教学和传播者主要是从C语言的使用者转移过来,C 语言的向下兼容性(即兼容C语言书写的源程序)使得这批教师能够较快的胜任C 语言的教学工作。不可否认,他们对中国高等教育的C 语言的教学和普及做出了不可磨灭的贡献。然而,C 语言所倡导的面向对象程序设计方法和C语言的面向过程程序设计方法还是存在着很大区别的,尤其是面向对象要求对数据进行封装保护的机制在C语言中是不存在的。而我们的第一批C 语言的传播者以及教材的编著者,却把C语言的风格和编程习惯带到了C 语言的教学中来,并且一直延续至今。例如:在C语言中主函数main是可以没有返回值的,即返回值类型可以是void,而在C 标准中,明确要求主函数main必须返回int类型。再例如,C语言中人们习惯使用字符数组或字符指针来保存字符串如char name[30], char *str等,而在C 中,提倡使用string对象来替代字符数组的变量。在我所使用的“十一五”国家级规范教材[3]中,从头到尾使用的都是字符数组和字符指针,而没有一处使用string对象,这明显违背了C 面向对象程序设计方法的精神。
有人问及C 语言的创始人也是C 标准的制定者之一Bjarne Stroustrup博士,有没有想过删除一些C 语言的特性。Bjarne Stroustrup博士说:从语言设计的角度讲,我最不喜欢的部分是与C兼容的那个子集[4]。然而,出于对现实世界里工作的程序员的考虑,保留与C兼容的子集是有必要的,但这并不意味着我们要写出C风格的C 程序。
3.2 大量非标准化编译器的影响
C语言和C 语言都是在UNIX平台下诞生的,在UNIX平台下使用的都是标准的编译器G 。而国内由于种种原因,UNIX平台一直未能进入主流的应用,大多数的企事业单位包括高校使用的都是MS Windows平台,高校教育又过分的偏爱了MS Visual C 这一典型的非标准C 编译器,即便是计算机等级考试这一全国性的考试,在C/C 的编程环境上也是选择了MS Visual C 。MS Visual C 编译器包含了很多与C 标准有出入的功能。这在某种程度上助长了C 的教学者编写出大量的非标准化代码。例如大家所熟悉的eof()函数,该函数根据当前指针是否指向文件结束部分而相应的返回true和false两个值,即当我们从一个文本文件读取数据时,如果指针指向文件的尾部则返回true,如果指针还未指向文件的尾部则返回false。MS Visual C 的编译器和基于标准C 的编译器如Dev-C 编译器对这个函数的处理却有很大的不同[5]。标准编译器在第一次读取文件的最后一个数据后仍然返回false,只有在试图继续读取数据时发现已经到了文件的结尾才返回true,而MS Visual C 编译器则在我们读取到文件的最后一个数据之后就返回true了。这样,针对不同的编译器,下面的这一段代码就有了不同的结果:
void totalFile(char *fName, float
关键词:C 标准;可移植性;高等教育
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)18-21ppp-0c
1 引言
1983年第一个C 程序投入使用,1994年8月,ANSI/ISO委员会草案登记,这便是业内所称的早期的C 标准,1998年11月,ISO/IEC:98-14882标准(以下简称98标准)被批准,标志着C 代码的标准化正式诞生[1]。C 语言诞生以来,延续了C语言的重要特征,即C 源程序良好的可移植性。正是这一特性,使得C/C 语言长期以来一直是程序开发人员的首选。
C 语言良好的可移植性是它具有较强生命力的关键所在。目前标准委员会正在修订C 标准,并拟于2009年发布修订后的09标准。可以预见,C 语言作为程序开发的主要工具仍将延续很长的一段时间。然而,国内高等教育尤其是高职教育,在C 语言的教学中却长期使用了非标准化的编码方式,这对于学生毕业后从事程序设计,写出具有良好可移植性的程序是相当不利的。
C 程序编码的标准化在互联网的一些论坛里有一些讨论,然而关于现行教材或专著里存在的问题,却鲜有文章进行报道。本文通过讨论现有高校教材尤其是高职教材中C 代码编写方式与现行C 标准的一些距离,试图引导高校教材尤其是高职教材中C 程序编码走向标准化。
2 标准化的目的和意义
标准化之争是信息时代商业竞争乃至国家之间竞争的必争之地。欧美的企业一直依赖都很热衷于标准化之争,UNIX从诞生到现在的各自为政就是一个很好的例子。而IT领域信息技术的高度集中和相对垄断也使得国际标准化组织制定的很多标准并没有被企业所采用,相反地,出现了很多像“Microsoft Windows”、“Internet Explorer”这种“事实上的工业标准”。C 语言从诞生到98标准诞生,花了整整15年的时间,对于发展迅猛的信息技术,这是一个相当漫长的过程。在此期间,国际上一些跨国公司如Microsoft、IBM、Borland(如今的Inprise)相继开发了自己的C 编译器,这些公司的编译器除了包含标准的C 编译器的内容之外,还加入了自己的一些特性,甚至修改了部分标准。一旦程序设计人员使用了这些非标准的特性,代码的可移植性将会成为一个大问题。因此,如何教导学生编写标准化的C 源程序,成为C 语言教学中一个非常重要的问题。
3 C 语言教学中存在的非标准化编码的主要问题
Microsoft公司曾经因为其在软件行业得天独厚的地位,而在MS Visual C 编译器中采使用了很多非标准化的内容。然而,在MS Visual Studio 2005发布之后,Microsoft公司相关人员特别指出该产品的一个重要变化就是完全符合98标准[2]。对于程序员来说,如果他原先在MS Visual C 中使用了非标准化的代码,在移植到MS Visual Studio2005这个平台上时将会花费相当大的精力去修改代码。即便是微软这样一个跨国企业,都不得不向国际标准靠拢,可想而知,标准化对于企业来讲是多么重要了。对于程序员,如何编写标准化的C 代码,保持C 代码的良好可移植性则是重中之重。然而,在我国的高校尤其是高职教材中却存在着甚至是大量存在着非标准化的C 程序,究其原因,笔者认为主要有如下几个方面:
3.1 C语言的影响
这也是最重要的一点。我国高校早期从事C 语言的教学和传播者主要是从C语言的使用者转移过来,C 语言的向下兼容性(即兼容C语言书写的源程序)使得这批教师能够较快的胜任C 语言的教学工作。不可否认,他们对中国高等教育的C 语言的教学和普及做出了不可磨灭的贡献。然而,C 语言所倡导的面向对象程序设计方法和C语言的面向过程程序设计方法还是存在着很大区别的,尤其是面向对象要求对数据进行封装保护的机制在C语言中是不存在的。而我们的第一批C 语言的传播者以及教材的编著者,却把C语言的风格和编程习惯带到了C 语言的教学中来,并且一直延续至今。例如:在C语言中主函数main是可以没有返回值的,即返回值类型可以是void,而在C 标准中,明确要求主函数main必须返回int类型。再例如,C语言中人们习惯使用字符数组或字符指针来保存字符串如char name[30], char *str等,而在C 中,提倡使用string对象来替代字符数组的变量。在我所使用的“十一五”国家级规范教材[3]中,从头到尾使用的都是字符数组和字符指针,而没有一处使用string对象,这明显违背了C 面向对象程序设计方法的精神。
有人问及C 语言的创始人也是C 标准的制定者之一Bjarne Stroustrup博士,有没有想过删除一些C 语言的特性。Bjarne Stroustrup博士说:从语言设计的角度讲,我最不喜欢的部分是与C兼容的那个子集[4]。然而,出于对现实世界里工作的程序员的考虑,保留与C兼容的子集是有必要的,但这并不意味着我们要写出C风格的C 程序。
3.2 大量非标准化编译器的影响
C语言和C 语言都是在UNIX平台下诞生的,在UNIX平台下使用的都是标准的编译器G 。而国内由于种种原因,UNIX平台一直未能进入主流的应用,大多数的企事业单位包括高校使用的都是MS Windows平台,高校教育又过分的偏爱了MS Visual C 这一典型的非标准C 编译器,即便是计算机等级考试这一全国性的考试,在C/C 的编程环境上也是选择了MS Visual C 。MS Visual C 编译器包含了很多与C 标准有出入的功能。这在某种程度上助长了C 的教学者编写出大量的非标准化代码。例如大家所熟悉的eof()函数,该函数根据当前指针是否指向文件结束部分而相应的返回true和false两个值,即当我们从一个文本文件读取数据时,如果指针指向文件的尾部则返回true,如果指针还未指向文件的尾部则返回false。MS Visual C 的编译器和基于标准C 的编译器如Dev-C 编译器对这个函数的处理却有很大的不同[5]。标准编译器在第一次读取文件的最后一个数据后仍然返回false,只有在试图继续读取数据时发现已经到了文件的结尾才返回true,而MS Visual C 编译器则在我们读取到文件的最后一个数据之后就返回true了。这样,针对不同的编译器,下面的这一段代码就有了不同的结果:
void totalFile(char *fName, float