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