基于短路逻辑运算的条件执行
作为逻辑运算符&&
和||
的评估 被定义为“短路”,我假设以下两段代码是等价的:
p = c || do_something();
和
if (c) { p = true; } else { p = do_something(); }
给定p
和c
是bool
, do_something()
是一个返回bool
并可能有副作用的函数。 根据C标准,可以依靠假设片段是等效的吗? 特别是,拥有第一个片段,是否承诺如果c
为真,则不会执行该function,并且不会产生副作用?
经过一些搜索后,我将自己引用标准回答我的问题: C99标准 ,第6.5.14节逻辑OR运算符说明:
与按位|不同 运算符,|| 运营商保证从左到右的评估; 在评估第一个操作数后有一个序列点。 如果第一个操作数比较不等于0,则不计算第二个操作数。
关于&&
的类似部分。 所以答案是肯定的,代码可以被认为是等效的。
是的,你的想法是正确的。 c || do_something()
如果c
为true
, c || do_something()
将短路,因此永远不会调用do_something()
。
但是,如果c
为false
,则调用do_something()
,其结果将是p
的新值。