c++ 表达式执行顺序

C++中表达式运算元的计算顺序是未定义的,不受从左到右或从右到左规则约束。计算顺序由运算符优先级和结合性决定,形成计算单元的有向图,通过拓扑排序可能产生多种执行顺序。Sequenced-before规则规定了表达式中计算单元的关系,如值计算、副作用等的顺序。未遵循这些规则可能导致undefined behavior,即计算顺序不确定,可能影响程序行为。
摘要由CSDN通过智能技术生成

计算顺序

在c++中,任何表达式(函数参数,子表达式)中的运算元的计算顺序都是不固定的。对于相同的表达式,编译器可能生成不同计算顺序的指令。

同时,在c++中,没有像从左到右,或从右到左的计算规则(刚接触c++的人,容易将计算顺序与运算符的结合性混淆)。比如表达式:

f1()+f2()+f3()

按加法从左向右的结合性,可以转换为:

(f1() + f2()) + f3()

结合性仅仅提供了,表达式需要计算那些单元,至于这些单元的计算顺序,需要使用其他规则。在本表达式中,f3() ,f2(),f1()的计算顺序是不定的,可能f3()最先计算,也可能,最后计算f3(),或者,先计算f2(),再计算f3()。

计算顺序模型

对于一个表达式,根据运算符的优先级与结合性,生成需要计算的计算单元集合。每两个计算单元有一种顺序关系,根据这种顺序关系,以计算单元为顶点,计算先后关系为边,生成一个有向图。

建立这个有向图之后,进行拓扑排序,即可得到一种执行顺序(因为有向图的拓扑排序不一定唯一,所以,可能产生多种执行顺序;如果这多种执行顺序影响程序的执行结果,则会造成程序行为undefined)

以f1()+f2()+f3()为例,

  1. 生成计算单元集合:{f1(), f2(), f3(),f1(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值