专家详解:复杂表达式的执行步骤

详解|执行

  近日在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++)进行评估,这是个赋值表达式,将右表达式的值赋给左边表达式的值。值得注意的是,对于赋值表达式,表达式本身的值等于左边子表达式的值。

  3.由于"!="表达式左边的子表达式的值已经被评估出来了,下面就执行"!="操作。"!="表达式的是一个布尔值。

  通过以上深入的分析,我们知道这个表达式完成了以下多个功能:

  1.对于指针strDest, strSrc,将strSrc所指的内存空间的值赋给由strDest所指的内存空间。

  2.判断赋值后的strDest所指的内存空间的指是否等于0。

  3.对于指针strDest,strSrc,他们的值分别加1,即指向下一个元素。

  我们可以看出,一个表达式完成了三个功能,表达式写的确实"相当紧凑"。而且这个表达式的值是可以确定的,因为所有的分析都是建立在C 标准的基础上。对于能否在实践的代码中使用这样的代码,这就智者见智了,关键一点就是要遵循项目的代码规范。

时间: 2024-09-19 23:54:06

专家详解:复杂表达式的执行步骤的相关文章

专家详解简单的四帧GIF动画制作方法

专家详解简单的四帧GIF动画制作方法 看似简单的动画,制作起来还是非常需要技巧和方法的.作者在这方面非常有经验,而且用了非常详细的文字来描述动画从前期到结尾,我们需要用到哪些面板和动作,怎么新建图层和保存动画等.这些都是非常难得的学习资料,有了这些,我们的动画制作水平会有质的提高. 最终效果 其它效果 1.前期准备:在PS里制作GIF所需要准备显示的几个窗口:图层.动画.动作. 一张完成动作的GIF如下图这样分解的,每一帧负责显示各自的图层内容.  2.做一些设置以便日后操作的过程简化. 在动画

图文详解mybatis+postgresql平台搭建步骤_java

从头开始搭建一个mybatis+postgresql平台 最近有个项目的数据库使用postgresql,使用原生态的mybatis操作数据,原生态的没什么不好,只不过国内有个tk.mybatis的工具帮助我们做了很多实用的事情,大多数情况下我们需要在原生态mybatis上加工的想法它基本上都已经有很好的实现,这篇将分享安装postgresql,配置tk.mybatis的详细步骤以及在这过程中可能遇到的一些小问题. 安装postgresql,执行下面的命令就可以安装了: 复制代码 代码如下: ap

新36条出炉民资接投资接力棒专家详解民资流向

4万亿的投资已经接近尾声,谁将引领中国经济继续下一轮的长跑?本周四,鼓励民间投资的新政策在长久的准备之后终于浮出水面. 国务院出台的这份<关于鼓励和引导民间投资健康发展的若干 意见>提出了36条鼓励和引导民间投资健康发展的意见,明确鼓励民间资本介入垄断禁区,包括电信.石油天然气等. 与2005年发布的政策相比,新政策更加细致全面,表述的语气也更加坚定.分析人士指出,新政进一步降低了准入条件.扩大了投资领域,是对民营企业放开投资领域的又一个里程碑式的政策.以求在国际金融危机影响尚存的情况下,激发

网友亲历诈骗!安全专家详解:一个验证码如何让你倾家荡产

最近,一篇名为<实录 | 亲历网络诈骗,互联网是如何让我生无分文?>的文章在网络广为传播. 作者表示,他莫名其妙地收到一条"订阅增值业务"的短信,根据提示回复了"取消+验证码"之后,自己的漫长的噩梦就此开启: 手机号码失效,半天之内支付宝.银行卡上的资金被席卷一空. 而损失巨大的作者到最后也没有完全明白自己的钱究竟是怎样被黑客盗取的. 作为爱和正义的守护者,雷锋网义不容辞,特地采访到腾讯手机管家安全专家陆兆华大牛,详细解析一下这个诈骗过程中每一步的技术细

复杂表达式的执行步骤

近日在CSDN上闲逛的时候,注意到一个帖子: ((*strDest++=*strSrc++)!='\0'); 哪儿前辈可以解释下里面具体执行的步骤呢? 对于这样的表达式,我们通常会有这样三种看法: 1.这种写法不但没有错误(当然也没有BUG),而且写法紧凑. 2.这种写法虽然没有错误,但是不够直观,理解起来有点麻烦,可能还会导致理解错误. 3.这种写法中存在未定义的地方,执行结果可能是错误的. 粗略来看,这三种说法都有点道理.我顿时有了刨根问底的兴趣,想对这个问题进行一次深入的分析.对于这种组合

乌克兰电站两次扑街,专家详解攻击凶器

       有一种痛只有乌克兰才懂. 2015年12月23日,乌克兰首都基辅部分地区和乌克兰西部的 140 万名居民突然遭遇了一次大停电,这次停电的罪魁祸首是黑客. 没想到,时隔一年,2016年12月17日,乌克兰的国家电力部门又遭遇了一次黑客袭击,这次停电了 30 分钟. 据外媒CBS报道,黑客向电力公司的员工发送了一封带附件的邮件,将登录证书偷到手后,又夺取了电站系统的控制权,切断了近 60 个变电站的断路器. 为了处理停电问题,发电站的工程师必须将发电站的设备切换到手动模式.相关技术人员

BAT专家详解勒索病毒冲击波:勒索物联网时代的开端

5月13日,一场流行病式的计算机病毒在全球的互联网世界中爆发,"疫情"已波及近百个国家.一旦感染该病毒,不到十秒,电脑里所有文件全被加密无法打开,只有按弹窗提示交赎金才能解密. 这一造成全球性恐慌的计算机病毒被称为"勒索病毒",又被叫做"敲诈者木马".这次传播的是一个名为"wannacry"的新家族,该木马通过加密形式,锁定用户电脑里的txt.doc.ppt.xls等后缀名类型的文档,导致用户无法正常使用程序,从而进行勒索,要

专家详解网购新规热点:7天无理由退货怎么退

[导读]哪些商品适用7天无理由退货?需要满足什么条件?无理由退货能否执行?少数网店仍挂"不予退换"霸王条款记者在淘宝网高级搜索中发现,全网符合全新商品检索条件的商品为34247万件,而加入七天退换保障条件的宝贝仅有12281.24万件.不少店铺仍在首页挂出类似"尺码色差等不属于质量问题不予退换"的免责声明,看似温馨提示,实为霸王条款,强制限定商品退换条件,公然损害消费者合法权益.某淘宝 卖家就在店内声明:"本店非七天无理由退货店铺,非质量问题不退换,请觉得

人机交互的重点是“机器”?CCF-ADL专家详解人类心理如何影响人机交互的打造

9 月 23 日-24 日,由中国计算机学会主办的 ADL 学科前沿讲习班<自然人机交互方法.技术与应用>邀请了国内人机交互领域的专家,从自然动作的建模和优化.触觉交互的关键技术.认知行为智能计算和交互自然性的心理学理论等方面对人机交互自然性的计算原理进行剖析,涉及原理.方法.技术和应用多方面的内容. 9 月 24 日下午,中国科学院心理研究所研究院.博导.副所长孙向红主要从心理学的角度,分析了在人机交互领域,心理学研究的必要性和作用,以及人机系统中,要以人为重点,心理负荷又会带来给人机交互带