当前位置:主页 > 金沙国际娱城app正文

金沙国际娱城app_一起听吧网进入

03月18日作者:黑曼巴


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

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

对付这样的表达式,我们平日会有这样三种见地:

1.这种写法不只没有差错(当然也没有BUG),而且写法紧凑。

2.这种写法虽金沙国际娱城app然没有差错,然则不敷直不雅,理解起来有点麻烦,可能还会导致理解差错。

3.这种写法中存在不决义的地方,履行结果可能是差错的。

粗略来看,这三种说法都有点事理。我立时有了刨根问底的兴趣,想对这个问题进行一次深入的阐发。对付这种组合金沙国际娱城app表达式,在阐发的时刻我们应该捉住两个关键的观点:优先级(Precedence)和关联性(Associativity)。

1.优先级(Precedence)。优先级抉择了那些表达式的值先被评估,那些表达式的值后被评估。平日环境下,优先级高的表达式的值先被评估出来后,然后用评估的结果再去评估那些优先级低的表达式。以是假如我们将优先级搞反了,评估出来的结果是差错的。

2.(Associativity)。对付二目表达式,关联性抉择了左边的表达式照样右边的表达式先被评估,先被评估出来的结果再用来评估别的的表达式。

再捉住这两个关键的同时,我们还应该分清什么是表达式的值,什么是变量的值。我们在评估表达式的时刻,我们感兴趣的是表达式的值,而不是构成表达式的某些变量的值。在很多环境下,表达式的值和某些变量的值是同等的,以是我们很轻易肴杂表达式的值和变量的值。要知道,在有些环境下,表达式的值并反面某些变量的值相同。

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

1. 很显着,上面的表达式是一个组合表达式。组合表达式由子表达式组成,子表达式又可能是组合表达式,这样就形成了一个树状的数据布局。对表达式的评估就类似于对树结点的遍历。首先我们应该留意到"()"操作符,它具有最高的优先级,以是从整体来看,金沙国际娱城app全部表达式应该是个"!="操作。"!="左边又是一个组合表达式,而右边是一个常量"\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++)进行金沙国际娱城app评估,这是个赋值表达式,将右表达式的值赋给左边表达式的值。值得留意的是,对付赋值表达式,表达式本身的值即是左边子表达式的值。

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

经由过程以上深入的阐发,我们知道这个表达式完成了以下多个功能:

1.对付指金沙国际娱城app针strDest, strSrc,将strSrc所指的内存空间的值赋给由strDest所指的内存空间。

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

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

我们可以看出,一个表达式完成了三个功能,表达式写切实着实实"相称紧凑"。而且这个表达式的值是可以确定的,由于所有的阐发都是建立在C标准的根基上。对付能否在实践的代码中应用这样的代码,这就智者见智了,关键一点便是要遵照项目的代码规范。

最近关注

热点内容

更多