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

Conditional execution based on short-circuit logical operation

由于逻辑运算符 &&|| 的计算定义为 "short circuit",我假设以下两段代码是等价的:

p = c || do_something();

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

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

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

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

经过一些搜索,我将参考标准自己回答我的问题: C99 standard 部分 6.5.14 逻辑或运算符 说明:

Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares unequal to 0, the second operand is not evaluated.

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