compilation - C++ compiler optimizations and short-circuit evaluation -
this question has answer here:
here code :
b = f() || b;
the function f()
has side effect , must executed. normally, right operand can short-circuited , code should work. afraid compilators reverse 2 operands, since it's more efficient short-circuit function evaluation rather simple variable evaluation. know g++ -o3 can break specifications, don't know if code can affected.
so, code risk-free?
i knew is short-circuiting logical operators mandated? , evaluation order? question compilers optimizations, didn't know can't break standards (even if strange).
but afraid compilators reverse 2 operands
these expressions must evaluated left-to-right. covered in standard operators &&
, ||
, ?
, , ,
. mention order, enforced sequence points.
§5.14.1 (logical and)
the
&&
operator groups left-to-right. operands both contextually converted bool (clause 4). result true if both operands true , false otherwise. unlike&
,&&
guarantees left-to-right evaluation: second operand not evaluated if first operand false.
§5.15.1 (logical or)
the
||
operator groups left-to-right. operands both contextually converted bool (clause 4). returns true if either of operands true, , false otherwise. unlike|
,||
guarantees left-to-right evaluation; moreover, second operand not evaluated if first operand evaluates true.
§5.16.1 (conditional operator)
conditional expressions group right-to-left. first expression contextually converted bool (clause 4). evaluated , if true, result of conditional expression value of second expression, otherwise of third expression. 1 of second , third expressions evaluated. every value computation , side effect associated first expression sequenced before every value computation , side effect associated the second or third expression.
§5.19.1 (comma operator)
the comma operator groups left-to-right. pair of expressions separated comma evaluated left-to-right; left expression discarded value expression (clause 5). every value computation , side effect associated left expression sequenced before every value computation , side effect associated right expression. type , value of result type , value of right operand; result of same value category right operand, , bit-field if right operand glvalue , bit-field. if value of right operand temporary (12.2), result temporary.
regarding concern optimizations violating order, no compilers not allowed change order. compilers must first , foremost (try to) follow standard. then can try make code faster. may not violate standard sake of performance. undermines entire premise of having standard.
Comments
Post a Comment