jan*_*ust 6 c conditional if-statement
所以我与一位同事讨论了评估执行的顺序.考虑这个条件:
if (a > b && ref++) { do something }
Run Code Online (Sandbox Code Playgroud)
我们都同意按照C标准,订单是从左到右.然而,不同意的是,尽管评估顺序,但是最终将评估其数据的一些指令可以被推测性地执行,然后尽管进行了惰性评估,仍然保持在该状态.
例如,ref在评估之前递增a > b,并且评估仍然从左到右发生,这是jump greater than两者的实际指令,a > b并且rev > 0从左到右按顺序执行,并且在第一个实例时放弃!true.现在这违背了懒惰评估的整个概念,但如果ref是指令流,内联函数可能会如此.开始以推测方式执行某些指令会更有意义.关注的是:这些指令是否已经提交,甚至是中途通过.
思考?
操作员&&(以及操作员||)在某种意义上是特殊的,因为它们保证了从左到右的"快捷评估".这意味着对于类似的条件 expr1 && expr2,expr1将始终首先进行评估,并且 - 甚至更多 - expr2如果expr1已经评估为false ,则根本不进行评估.这不是优化,这是由语言保证的.
因此,当且仅当求值时if (a > b && ref++),ref++将评估表达式(包括递增的副作用ref).a > btrue