基于短路逻辑运算的条件执行

作为逻辑运算符&&||的评估 被定义为“短路”,我假设以下两段代码是等价的:

 p = c || do_something(); 

 if (c) { p = true; } else { p = do_something(); } 

给定pcbooldo_something()是一个返回bool可能有副作用的函数。 根据C标准,可以依靠假设片段是等效的吗? 特别是,拥有第一个片段,是否承诺如果c为真,则不会执行该function,并且不会产生副作用?

经过一些搜索后,我将自己引用标准回答我的问题: C99标准 ,第6.5.14逻辑OR运算符说明:

与按位|不同 运算符,|| 运营商保证从左到右的评估; 在评估第一个操作数后有一个序列点。 如果第一个操作数比较不等于0,则不计算第二个操作数。

关于&&的类似部分。 所以答案是肯定的,代码可以被认为是等效的。

是的,你的想法是正确的。 c || do_something() 如果ctruec || do_something()将短路,因此永远不会调用do_something()

但是,如果cfalse ,则调用do_something() ,其结果将是p的新值。