首页 / 软件开发 / C语言 / 复杂表达式的执行步骤
复杂表达式的执行步骤2007-10-07近日在CSDN上闲逛的时候,注意到一个帖子:((*strDest++=*strSrc++)!=" "); 哪儿前辈可以解释下里面具体执行的步骤呢?对于这样的表达式,我们通常会有这样三种看法:1.这种写法不但没有错误(当然也没有BUG),而且写法紧凑。2.这种写法虽然没有错误,但是不够直观,理解起来有点麻烦,可能还会导致理解错误。3.这种写法中存在未定义的地方,执行结果可能是错误的。粗略来看,这三种说法都有点道理。我顿时有了刨根问底的兴趣,想对这个问题进行一次深入的分析。对于这种组合表达式,在分析的时候我们应该抓住两个关键的概念:优先级(Precedence)和关联性(Associativity)。1.优先级(Precedence)。优先级决定了那些表达式的值先被评估,那些表达式的值后被评估。通常情况下,优先级高的表达式的值先被评估出来后,然后用评估的结果再去评估那些优先级低的表达式。所以如果我们将优先级搞反了,评估出来的结果是错误的。2.(Associativity)。对于二目表达式,关联性决定了左边的表达式还是右边的表达式先被评估,先被评估出来的结果再用来评估另外的表达式。再抓住这两个关键的同时,我们还应该分清什么是表达式的值,什么是变量的值。我们在评估表达式的时候,我们感兴趣的是表达式的值,而不是构成表达式的某些变量的值。在很多情况下,表达式的值和某些变量的值是一致的,所以我们很容易混淆表达式的值和变量的值。要知道,在有些情况下,表达式的值并不和某些变量的值相同。有了上面的理论来武装我们,对表达式的分析就显得游刃有余了:1. 很明显,上面的表达式是一个组合表达式。组合表达式由子表达式组成,子表达式又可能是组合表达式,这样就形成了一个树状的数据结构。对表达式的评估就类似于对树结点的遍历。首先我们应该注意到"()"操作符,它具有最高的优先级,所以从整体来看,整个表达式应该是个"!="操作。"!="左边又是一个组合表达式,而右边是一个常量"