基于短路逻辑运算的条件执行
Conditional execution based on short-circuit logical operation
由于逻辑运算符 &&
和 ||
的计算定义为 "short circuit",我假设以下两段代码是等价的:
p = c || do_something();
和
if (c) {
p = true;
}
else {
p = do_something();
}
给定 p
和 c
是 bool
,do_something()
是一个返回 bool
和 可能有副作用的函数。根据 C 标准,是否可以依赖片段等效的假设?特别是,对于第一个片段,是否承诺如果 c
为真,则不会执行该函数,并且不会产生任何副作用?
是的,你的想法是对的。如果 c
为 true
,c || do_something()
将短路,因此永远不会调用 do_something()
。
但是,如果 c
是 false
,那么 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.
以及关于 &&
的类似部分。
所以答案是肯定的,代码可以安全地认为是等效的。
由于逻辑运算符 &&
和 ||
的计算定义为 "short circuit",我假设以下两段代码是等价的:
p = c || do_something();
和
if (c) {
p = true;
}
else {
p = do_something();
}
给定 p
和 c
是 bool
,do_something()
是一个返回 bool
和 可能有副作用的函数。根据 C 标准,是否可以依赖片段等效的假设?特别是,对于第一个片段,是否承诺如果 c
为真,则不会执行该函数,并且不会产生任何副作用?
是的,你的想法是对的。如果 c
为 true
,c || do_something()
将短路,因此永远不会调用 do_something()
。
但是,如果 c
是 false
,那么 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.
以及关于 &&
的类似部分。
所以答案是肯定的,代码可以安全地认为是等效的。