表达式求值_序列点.pdfVIP

  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++ 语言中的表达式求值 第 1 页 C/C++ 语言中表达式的求值 裘宗燕 北京大学数学学院信息科学系 本文基本内容发表于《编程高手》杂志 2004 年第 12 期 经常可以在一些讨论组里看到下面的提问:“谁知道下面 C 语句给 n 赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友发 email 给我,问为什么在某个 C++系统里,下面表达式打印出两个 4 ,而不是4 和 5: a = 4; cout a++ a; C++ 不是规定 操作左结合吗?是 C++ 书上写错了,还是这个系统的实现有问题? 要弄清这些,需要理解的一个问题是:如果程序里某处修改了一个变量(通过赋值、增 量/减量操作等),什么时候从该变量能够取到新值?有人可能说,“这算什么问题!我修改 了变量,再从这个变量取值,取到的当然是修改后的值!”其实事情并不这么简单。 C/C++ 语言是“基于表达式的语言”,所有计算(包括赋值)都在表达式里完成。“x = 1;”就是表达式“x = 1 ”后加表示语句结束的分号。要弄清程序的意义,首先要理解表达式 的意义,也就是:1)表达式所确定的计算过程;2 )它对环境(可以把环境看作当时可用的 所有变量)的影响。如果一个表达式(或子表达式)只计算出值而不改变环境,我们就说它 是引用透明的,这种表达式早算晚算对其他计算没有影响(不改变计算的环境。当然,它的 值可能受到其他计算的影响)。如果一个表达式不仅算出一个值,还修改了环境,就说这个 表达式有副作用(因为它多做了额外的事)。a++ 就是有副作用的表达式。这些说法也适用 于其他语言里的类似问题。 现在问题变成:如果 C/C++ 程序里的某个表达式(部分)有副作用,这种副作用何时 才能实际体现到使用中?为使问题更清楚,我们假定程序里有代码片段“...a[i]++ ... a[j] ...”, 假定当时 i 与j 的值恰好相等(a[i] 和 a[j] 正好引用同一数组元素);假定a[i]++ 确实在 a[j] 之前计算;再假定其间没有其他修改 a[i] 的动作。在这些假定下,a[i]++ 对 a[i] 的修改能 反映到 a[j] 的求值中吗?注意:由于 i 与 j 相等的问题无法静态判定,在目标代码里,这 两个数组元素访问(对内存的访问)必然通过两段独立代码完成。现代计算机的计算都在寄 存器里做,问题现在变成:在取 a[j] 值的代码执行之前,a[i] 更新的值是否已经被(从寄 存器)保存到内存?如果了解语言在这方面的规定,这个问题的答案就清楚了。 程序语言通常都规定了执行中变量修改的最晚实现时刻(称为顺序点、序点或执行点)。 程序执行中存在一系列顺序点(时刻),语言保证一旦执行到达一个顺序点,在此之前发生 的所有修改(副作用)都必须实现(必须反应到随后对同一存储位置的访问中) ,在此之后 的所有修改都还没有发生。在顺序点之间则没有任何保证。对 C/C++ 语言这类允许表达式 有副作用的语言,顺序点的概念特别重要。 现在上面问题的回答已经很清楚了:如果在 a[i]++ 和 a[j] 之间存在一个顺序点,那么 就能保证 a[j] 将取得修改之后的值;否则就不能保证。 裘宗燕:C/C++ 语言中的表达式求值 第 2 页 C/C++语言定义(语言的参考手册)明确定义了顺序点的概念。顺序点位于: 1. 每个完整表达式结束时。完整表达式包括变量初始化表达式,表达式语句,return 语句 的表达式,以及条件、循环和 switch 语句的控制表达式(for 头部有三个控制表达式); 2.

文档评论(0)

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

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

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档