问题
As the evaluation of logical operators &&
and ||
are defined as "short circuit", I am assuming the following two pieces of code are equivalent:
p = c || do_something();
and
if (c) {
p = true;
}
else {
p = do_something();
}
given p
and c
are bool
, and do_something()
is a function returning bool
and possibly having side effects. According to the C standard, can one rely on the assumption the snippets are equivalent? In particular, having the first snippet, is it promised that if c
is true, the function won't be executed, and no side effects of it will take place?
回答1:
After some search I will answer my question myself referencing the standard: The C99 standard, section 6.5.14 Logical OR operator is stating:
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.
And a similar section about &&
.
So the answer is yes, the code can be safely considered equivalent.
回答2:
Yes, you are correct in your thinking. c || do_something()
will short-circuit if c
is true
, and so will never call do_something()
.
However, if c
is false
, then do_something()
will be called and its result will be the new value of p
.
来源:https://stackoverflow.com/questions/31437095/conditional-execution-based-on-short-circuit-logical-operation