- 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++ 语言中的表达式求值 第 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.
您可能关注的文档
最近下载
- 2025广西公需科目考试答案(3套,涵盖95_试题)一区两地一园一通道建设;人工智能时代的机遇与挑战.pdf VIP
- 2025商用车发动机气缸体铸件技术条件.docx VIP
- 颅内复杂动脉瘤介入治疗围术期护理专家共识2025 .pdf
- 第二节病虫害预测预报教学教材.ppt VIP
- 电梯新检规施工自检报告-曳引客货-2024.doc
- 2025年高考英语(新高考Ⅱ卷)试卷评析及2026高考备考策略 课件.pptx
- 2000年全国高中学生化学竞赛决赛(冬令营)理论试题与实验试题及参考答案精品.pdf VIP
- 苹果公司知识产权保护策略.pptx
- 中药饮片智能调剂与煎煮关键技术研究课件.pdf VIP
- 局部解剖学(山东联盟) 智慧树 知到答案.docx VIP
文档评论(0)