唐山网站建设

设为主页 加入收藏 繁體中文

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

核心提示:专家详解:复杂表达式的履行步骤

近日在CSDN上闲逛的时候,留意到1个帖子:

((*strDest++=*strSrc++)!='\0'); 哪儿先辈可以解释下里面具体履行的步骤呢?

对这样的表达式,我们通常会有这样3种看法:

1.这类写法不但没有毛病(固然也没有BUG),而且写法紧凑。

2.这类写法固然没有毛病,但是不够直观,理解起来有点麻烦,可能还会导致理解毛病。

3.这类写法中存在未定义的地方,履行结果多是毛病的。

粗略来看,这3种说法都有点道理。我顿时有了寻根究底的爱好,想对这个题目进行1次深进的分析。对这类组合表达式,在分析的时候我们应当捉住两个关键的概念:优先级(Precedence)和关联性(Associativity)。

1.优先级(Precedence)。优先级决定了那些表达式的值先被评估,那些表达式的值后被评估。通常情况下,优先级高的表达式的值先被评估出来后,然后用评估的结果再往评估那些优先级低的表达式。所以假设我们将优先级弄反了,评估出来的结果是毛病的。

2.(Associativity)。对2目表达式,关联性决定了左侧的表达式还是右侧的表达式先被评估,先被评估出来的结果再用来评估另外的表达式。

再捉住这两个关键的同时,我们还应当分清甚么是表达式的值,甚么是变量的值。我们在评估表达式的时候,我们感爱好的是表达式的值,而不是构成表达式的某些变量的值。在很多情况下,表达式的值和某些变量的值是1致的,所以我们很轻易混淆表达式的值和变量的值。要知道,在有些情况下,表达式的值其实不和某些变量的值相同。

有了上面的理论来武装我们,对表达式的分析就显得游刃有余了:

1. 很明显,上面的表达式是1个组合表达式。组合表达式由子表达式组成,子表达式又多是组合表达式,这样就构成了1个树状的数据结构。对表达式的评估就类似于对树结点的遍历。首先我们应当留意到"()"操纵符,它具有最高的优先级,所以从整体来看,全部表达式应当是个"!="操纵。"!="左侧又是1个组合表达式,而右侧是1个常量"\0',很明显下面的工作就是评估(*strDest++=*strSrc++)。

2.在这1步,我们要对表达式(*strDest++=*strSrc++)进行评估。由于赋值表达式具有较低的优先级,所以表达式 又可以写成:(*strDest++) = (*strSrc++),所以全部表达式是个"="操纵,"="左侧又是1个组合表达式,右侧也是1个组合表达式,这里就需要从关联性来判定左侧还是右侧也被评估。由于"="的关联性是从右到左,所以(*strSrc++)先被评估,(*strDest++)后被评估。

2.1 在这1步,我们要对表达式(*strSrc++)进行评估。由于"++"的优先级大于"*",所以表达式又可以写成:*(strSrc++)。我们要先对表达式strSrc++进行评估,然后用表达式的值再往评估*(strSrc++)的值。对表达式strSrc++,这里要需要留意辨别变量的值和表达式的值。对"后增1"表达式,表达式的值是变量strSrc的值,然后变量strSrc的值会"加1",也就是说表达式的值是strSrc变化前的值,而strSrc的值会产生变化。值得留意的是,我们知道strSrc的值会产生变化,但是我们却不知道strSrc的值产生变化的具体时间,这个变化具体的履行时间由编译器决定了,这就决定了任何依托strSrc的表达式的值是不肯定的,具体的值依托编译器的实现。完成了对strSrc++的评估后,取值操纵符就对表达式的值所对应的内存空间进行取值操纵。

2.2 在这1步,我们要对表达式(*strDest++)进行评估。具体的评估的分析完全和2.1中的分析1致。

2.3 在这1步,我们要对表达式(*strDest++) = (*strSrc++)进行评估,这是个赋值表达式,将右表达式的值赋给左侧表达式的值。值得留意的是,对赋值表达式,表达式本身的值即是左侧子表达式的值。

3.由于"!="表达式左侧的子表达式的值已被评估出来了,下面就履行"!="操纵。"!="表达式的是1个布尔值。

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

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

2.判定赋值后的strDest所指的内存空间的指是否是即是0。

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

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

http://www.fw8.net/
TAG:组合,变量,优先级,表达式,关联性
评论加载中...
内容:
评论者: 验证码: