计算顺序
在c++中,任何表达式(函数参数,子表达式)中的运算元的计算顺序都是不固定的。对于相同的表达式,编译器可能生成不同计算顺序的指令。
同时,在c++中,没有像从左到右,或从右到左的计算规则(刚接触c++的人,容易将计算顺序与运算符的结合性混淆)。比如表达式:
f1()+f2()+f3()
按加法从左向右的结合性,可以转换为:
(f1() + f2()) + f3()
结合性仅仅提供了,表达式需要计算那些单元,至于这些单元的计算顺序,需要使用其他规则。在本表达式中,f3() ,f2(),f1()的计算顺序是不定的,可能f3()最先计算,也可能,最后计算f3(),或者,先计算f2(),再计算f3()。
计算顺序模型
对于一个表达式,根据运算符的优先级与结合性,生成需要计算的计算单元集合。每两个计算单元有一种顺序关系,根据这种顺序关系,以计算单元为顶点,计算先后关系为边,生成一个有向图。
建立这个有向图之后,进行拓扑排序,即可得到一种执行顺序(因为有向图的拓扑排序不一定唯一,所以,可能产生多种执行顺序;如果这多种执行顺序影响程序的执行结果,则会造成程序行为undefined)
以f1()+f2()+f3()为例,
-
生成计算单元集合:{f1(), f2(), f3(),f1(