专家详解:复杂表达式的执行步骤
日期:2007年7月15日 作者: 查看:[大字体 中字体 小字体]-
近日在CSDN上闲逛的时候,注意到一个帖子:
((*strDest++=*strSrc++)!='\0'); 哪儿前辈可以解释下里面具体执行的步骤呢?
对于这样的表达式,我们通常会有这样三种看法:
1.这种写法不但没有错误(当然也没有BUG),而且写法紧凑。
2.这种写法虽然没有错误,但是不够直观,理解起来有点麻烦,可能还会导致理解错误。
3.这种写法中存在未定义的地方,执行结果可能是错误的。
粗略来看,这三种说法都有点道理。我顿时有了刨根问底的兴趣,想对这个问题进行一次深入的分析。对于这种组合表达式,在分析的时候我们应该抓住两个关键的概念:优先级(Precedence)和关联性(Associativity)。
1.优先级(Precedence)。优先级决定了那些表达式的值先被评估,那些表达式的值后被评估。通常情况下,优先级高的表达式的值先被评估出来后,然后用评估的结果再去评估那些优先级低的表达式。所以如果我们将优先级搞反了,评估出来的结果是错误的。
2.(Associativity)。对于二目表达式,关联性决定了左边的表达式还是右边的表达式先被评估,先被评估出来的结果再用来评估另外的表达式。
再抓住这两个关键的同时,我们还应该分清什么是表达式的值,什么是变量的值。我们在评估表达式的时候,我们感兴趣的是表达式的值,而不是构成表达式的某些变量的值。在很多情况下,表达式的值和某些变量的值是一致的,所以我们很容易混淆表达式的值和变量的值。要知道,在有些情况下,表达式的值并不和某些变量的值相同。
有了上面的理论来武装我们,对表达式的分析就显得游刃有余了:
1. 很明显,上面的表达式是一个组合表达式。组合表达式由子表达式组成,子表达式又可能是组合表达式,这样就形成了一个树状的数据结构。对表达式的评估就类似于对树结点的遍历。首先我们应该注意到"()"操作符,它具有最高的优先级,所以从整体来看,整个表达式应该是个"!="操作。"!="左边又是一个组合表达式,而右边是一个常量"\0',很明显下面的工作就是评估(*strDest++=*strSrc++)。
2.在这一步,我们要对表达式(*strDest++=*strSrc++)进行评估。由于赋值表达式具有较低的优先级,所以表达式 又可以写成:(*strDest++) = (*strSrc++),所以整个表达式是个"="操作,"="左边又是一个组合表达式,右边也是一个组合表达式,这里就需要从关联性来判断左边还是右边也被评估。由于"="的关联性是从右到左,所以(*strSrc++)先被评估,(*strDest++)后被评估。
2.1 在这一步,我们要对表达式(*strSrc++)进行评估。由于"++"的优先级大于"*",所以表达式又可以写成:*(strSrc++)。我们要先对表达式strSrc++进行评估,然后用表达式的值再去评估*(strSrc++)的值。对于表达式strSrc++,这里要需要注意区分变量的值和表达式的值。对于"后增1"表达式,表达式的值是变量strSrc的值,然后变量strSrc的值会"加1",也就是说表达式的值是strSrc变化前的值,而strSrc的值会发生变化。值得注意的是,我们知道strSrc的值会发生变化,但是我们却不知道strSrc的值发生变化的具体时间,这个变化具体的执行时间由编译器决定了,这就决定了任何依赖strSrc的表达式的值是不确定的,具体的值依赖编译器的实现。完成了对strSrc++的评估后,取值操作符就对表达式的值所对应的内存空间进行取值操作。
2.2 在这一步,我们要对表达式(*strDest++)进行评估。具体的评估的分析完全和2.1中的分析一致。
2.3 在这一步,我们要对表达式(*strDest++) = (*strSrc++)进行评估,这是个赋值表达式,将右表达式的值赋给左边表达式的值。值得注意的是,对于赋值表达式,表达式本身的值等于左边子表达式的值。
- [1] [2] 下一页
-
- 专家详解:复杂表达式的执行步骤 相关文章:
- ·网络安全专家支招防范黑客攻击九大方法
- ·专家:警惕“ARP骗子”病毒渗透局域网
- ·趋势科技网络安全专家2008评测
- ·安全专家谈未来网络的十大安全趋势
- ·女郎专属 欧洲婚纱名品Rembo设计
- ·QQ聊天记录保密有技巧 专家教你三招
- ·关于无效点击-AdSense团队资深专员如是说
- ·站长大赛专访回放,杨伟庆专访
- ·专访51Auto创始人:5句话融到4000多万
- ·安全专家支招防范黑客攻击九大方法
- 专家详解:复杂表达式的执行步骤 相关软件
- ·服装专卖店网站模板免费版
- ·《反恐精英CS》夜视镜专用地图cs_17elwell
- ·魔兽CEG2006专用地图下载
- ·《雷神之锤4》v1.3到v1.4.2升级补丁(Windows系统专用)
- ·《专业自行车经理2007》试玩
- ·《热血传奇》专用下载器
- ·恶灵谈判专家
- ·《彩虹岛》专用下载器
- ·《传奇世界浩方专区》完整客户端
- ·专案组长
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
精品推荐
热点TOP10
- ·Community Server专题三:HttpModule
- ·ASP.Net2.0 GridView 多列排序,显示排序图标,分页
- ·根据选择的树形节点用asp.net结合dw和js动态生成可移动可展开的层
- ·在 ASP.NET 2.0 中上载文件
- ·通过webservices上传下载文件
- ·让ASP.NET简便使用SCRIPT
- ·CMPP SP端 C# 实例
- ·生成 ContentRotator ASP.NET 服务器控件
- ·揭开ASP.NET中Cookie编程的奥秘
- ·生成静态文件的新闻系统核心代码(.net C#)
- ·ASP.NET技巧:用MasterPage 代替 PageBase
- ·ASP.NET2.0数据操作之母板页和站点导航
- ·C#捕捉摄相头的数据流
- ·理解并扩展 ASP.NET 2.0 中的站点导航系统
- ·Community Server专题四:HttpHandler
- ·DataList嵌套实例
- ·ASP.NET技巧:教你制做Web实时进度条
- ·将图片插入数据库并使用asp.net读取出来的正确方法
- ·ASP.NET:Repeater控件的详解
- ·如何在上传的图片上加上版权文字
特别推荐
- ·.net基础知识错误注意二十二点知识
- ·asp.net2.0学习历程 菜鸟到中级程序员的飞跃
- ·.NET基础知识-什么是.NET
- ·初学C#+ASP.NET+Oracle时积累的备忘点滴
- ·专家详解:复杂表达式的执行步骤
- ·asp.net中的加密方法
- ·DataGrid常见关注问题解决方案
- ·学习笔记 ASP.NET 5种页面转向法
- ·ASP.NET网络编程中经常会用到的27个函数集
- ·ASP.NET之上传文件管理策略
- ·专家:用.NET动态创建类的实例讲解
- ·ASP.NET WEB服务和Flash打造MP3播放器
- ·精通ASP.NET中弹出窗口技术
- ·asp.net常用代码
- ·asp.net创建文件夹的IO类的问题
- ·Asp.Net函数集
- ·Asp.net cache 简述
- ·如何最大限度提高.NET的性能 (续)
- ·.NET编程规范
- ·Asp.net1.1升级到2.0遇到的一些问题总结
