当前位置:天才代写 > tutorial > C语言/C++ 教程 > 巨大表达式的执行步调

巨大表达式的执行步调

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:351

克日在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尺度的基本上。对付可否在实践的代码中利用这样的代码,这就智者见智了,要害一点就是要遵循项目标代码类型。

 

    关键字:

天才代写-代写联系方式