C语言教学中关于自加运算符理解误区.docVIP

C语言教学中关于自加运算符理解误区.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言教学中关于自加运算符理解误区

C语言教学中关于自加运算符理解误区   摘要:C语言教学过程中普遍存在一个对C语言中自加运算符的错误认识,根据C99规范对该错误进行详细分析,指出后缀加运算符与前缀加运算符的本质区别,解释C语言中令人颇难理解的一个特性。 关键词:C语言;自加运算;后缀加;前缀加;优先级 文章编号:1672-5913(2013)03-0026-03 中图分类号:G642 随着计算机教育的普及,C语言已经成为各所高校理工科专业的必修课程。由于C语言本身是为熟练程序员准备的程序设计语言,使用非常灵活,但同时又极容易出错,因此对教学者提出了更高的要求。 笔者在10多年的教学过程中,发现自己对C语言的某些知识理解是错误的;在与同行交流时,也发现某些同行由于缺乏实际的编程经验,犯下一些知识性的错误。目前使用c语言容易犯的错误已高达100多种,其中有一个对自加运算符的理解错误最为普遍,流传甚广,却至今无人明确提出,笔者拟对此作出澄清。 1 关于后缀自加的一个主流观点 自加运算符(++)是C语言中使用最普遍的一个运算符(由于自减运算符存在的问题与自加完全相同,下面只谈自加运算符),它分为前缀加和后缀加两种。其中前缀加的运算规则相对比较简单,一般均可正确理解。但后缀加的运算规则理解起来要困难得多,笔者发现不少同仁均在此处犯错,且极不容易发现。 在我国高校中使用最广泛的C语言教材是谭浩强先生的《C语言程序设计》,至2009年,该书已经再版3次,发行量超过1000万册,可谓影响深远。该书在介绍自加运算符时,先是如此说明: ++i,--i(在使用i之前,先使i的值加或减1) i++,i--(在使用i之后,使i的值加或减1) 并补充解释到:“但++i和i++的不同之处在于++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1”。随后举了一个程序例子: i=3: j=++i;//j的值为4 i=3; j=i++;//j的值为3,然后i变为4 在程序之后,作者又补充到:“注意(i++)是先用i的原值进行运算以后,再对i加1”。从上述描述不难看出,谭浩强先生对于“j=i++”执行的过程可以理解为下面两步操作: i→j i+1→i 从中可以看出,后缀加的运算优先级比赋值号的优先级更低。该观点在随后的两个版本中虽然描述文字有所出入,但基本思想一直保留。谭浩强先生的这一观点受到普遍认同,笔者随机找到10余种C语言程序设计书籍,均同意这一观点。虽然各书所举的例子不尽相同,但都能印证这一解释的正确性。于是这一解释成为目前C语言教学中的主流观点,笔者曾不止一次听到在课堂教学中老师将这一解释介绍给学生,并将其简单总结为:“前缀加是在其他操作之前加1,后缀加是在赋值操作之后加1”。 2 无法解释的矛盾 上述观点在仅有算术运算的情况下能够正确解释程序运行的结果,再加上谭浩强先生的权威,因此成为了主流观点。但实际上,这一观点有一个重大的漏洞。按照该观点,前缀加和后缀加必须是两个运算符,其中前缀加的优先级高于赋值运算,而后缀加的优先级则低于赋值运算。而所有的C语言教材都承认,自加运算符的优先级只有一个,位于所有运算符中的第二级。这一规定是由ISO/IEC组织在《ISO/ICE 9899:1999,C programming language standard》(以下简称C99标准)中规定,教材作者无权更改。 为解决这一矛盾,明确提出:“把前缀自增(自减)和后缀自增(自减)运算符看成两种运算符,且规定前缀自增(自减)运算符的优先级大于算术运算符,后缀自增(自减)运算符的优先级低于赋值运算符”,即需要修改C99标准。 暂且不提修改C99标准这一愿望是否能实现,即便修改了C99标准暂时解决这一矛盾,但由于这一观点的内涵是错误的,必将会在其他方面暴露出来,下面看一个程序段: int a[2]={1,2},t; int*p=a; t=*p++; printf(”t=%d,a[0]=%d,a[0]=%p,a[1]=%p,p=%p”,t,a[0],a[0],a[1],p); 按照前述“后缀加运算优先级低于赋值号”的观点C99标准中自加运算符位于所有运算符中第二级的规定,该程序的第4行应该这么来理解:“*”的优先级最高,它和p结合,于是将p所指向的存储单元内容(a[0]的值,等于1)赋值给t;然后执行后缀加运算,由于后缀加的优先级低于“*”,因此运算数p应先执行“*”运算后,得到的后果再执行后缀加运算。于是后缀加运算是将p所指向的存储单元(即a[0])的值加1,而p里面存储的地址值不发生变化,还是a[0]的地址值。依

文档评论(0)

docman126 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7042123103000003

1亿VIP精品文档

相关文档