- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
序列点――C语言教学的一个普遍盲区
摘要:我们分析了国内C语言教材中普遍存在的一类错误,这类错误主要源于对序列点基本概念的缺失。因此,我们认为必须通过引入序列点这个概念来纠正教学中的这类错误。
关键词:教学;序列点;未定义行为
中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)09-2105-02
Sequence Point ― Blind Spot in the Teaching of the C Language Programming
HUANG Ying,HU Lie,ZHU Qi-shen
(School of Computer and Software Engineering, Nanjing Institute of Industry Technology, Nanjing 210046, China)
Abstract: We analyzed a kind of commonly existing error in the textbooks of the C language programming. The cause of the errors is due to the lack of understanding of the conception of the sequence point. Such errors should be corrected with the introducing of the important concept of the sequence point in the textbooks.
Key words: C language teaching;sequence point;undefined behavior
C语言作为IT业的一种主流程序设计语言,也是一种很适当的程序设计入门的教学语言。国内的大专院校的许多专业都开设了这门课程,并且大多专业将其作为第一门程序设计语言课程,同时C语言也是全国计算机等级考试二级的内容。因此,C语言的教学质量对学生的后续学习和取得等级证书很重要,尤其是对学生在实际工作中能正确理解和应用C语言有非常重要的意义。
目前,国内绝大多数教材在介绍C语言表达式时,都没有介绍C语言的一个重要概念――序列点(sequence point)。甚至不少教材作者自己本身也不了解这个概念,在教材中常常对表达式给出错误的分析和讲解。类似下面的错误分析和讲解在很多C语言教材中都出现过:
“赋值表达式也可以包括复合的赋值运算符。例如:
a+=a-=a*a
也是一个赋值表达式。如果a的初值为12,此赋值表达式的求解步骤如下:
① 先进行“a-=a*a”的运算,它相当于a=a-a*a,a的值为12-144=-132。
② 再进行“a+=-132”的运算,相当于a=a+(-132),a的值为-132-132=-264。”[4]
然而,“a+=a-=a*a”这个表达式本身就是错误的,上面对这个表达式的分析同样是错误的。错误的根源在于不了解序列点这个概念以及相关的C语言语法规则。
1 序列点及有关概念
根据最新的C语言国际标准(后面简称为C99)的定义,序列点就是执行序列中的一些特定点,在这些点上,前面求值的副效应(side effect)应彻底完成且其后求值的副效应均未发生。
最常见的序列点是语句结束符号“;”,它的含义是其前面的副效应到此必须完成,而其后面尚未发生。
如果不存在函数调用子表达式,表达式中的序列点只有4个:、||、,和运算符“?:”中的“?”。其余的运算符均非序列点。
副效应(side effect)0是与表达式求值有关的一个概念,是指在表达式计算过程中除了求值以外的各种行为或效果。例如,对于
int i;
来说,表达式“i = 5”的作用是求表达式的值(这个值是5),而变量i被赋值为5就是这个表达式的副效应。
2 写C语言表达式的一个基本原则
C99规定:在前后相邻两个序列点之间,数据对象所存储的值最多只能通过表达式求值改变一次,而且只能以先读对象的方式访问它以确当时存储的值0。
这是用C语言书写表达式的一个基本原则。通俗地说就是在两个序列点之间,绝对不容许改变同一数据对象的值两次或两次以上。
根据这个原则考察一下本文一开始引文中提到的表达式“a+=a-=a*a”。在“a+=a-=a*a”这个表达式中,由于在该表达式之中并不存在序列点,所以它必定是处于两个相邻序列点之间的一个表达式;然而由于赋值运算的副效应,a数据对象的值却被改变了两次。毫无疑问这违背了C语言
文档评论(0)