在逻辑 AND 表达式中保证函数调用
Guarantee function call in logical AND expression
我正在使用 C++ 原子重构一些代码。代码如下所示:
std::atomic<bool> someFlag{}; // This can be set to true using a public method
// ...
const bool cond1 { someFunction() };
const bool cond2 { otherFunction() };
if (someFlag.load())
{
someFlage.store(false);
if (cond1 && cond2)
{
performSomeAction();
}
}
我目前正计划像这样重写 if
语句:
if (std::atomic_exchange(&someFlag, false) &&
cond1 && cond2)
{
performSomeAction();
}
极其重要的是,在这条if
语句之后,someFlag
变量被设置为false
。
因此,我想确保对 atomic_exchange
的调用始终发生,而不管 cond1
和 cond2
的值如何。我可以保证会是这种情况吗,因为无论优化设置如何,布尔表达式都是从左到右求值的?
是的,订单有保证。来自 cppreference.com:
Every value computation and side effect of the first (left)
argument of the built-in logical AND operator &&
and the built-in
logical OR operator ||
is sequenced before every value computation and
side effect of the second (right) argument.
在if (std::atomic_exchange(&someFlag, false) &&
cond1 && cond2)
std::atomic_exchange(&someFlag, false)
将首先被调用。
如果评估为 true
,则评估为 cond1
如果 cond1
为真,计算 cond2
。
最后 performSomeAction()
如果 cond2
也是 true
.
我正在使用 C++ 原子重构一些代码。代码如下所示:
std::atomic<bool> someFlag{}; // This can be set to true using a public method
// ...
const bool cond1 { someFunction() };
const bool cond2 { otherFunction() };
if (someFlag.load())
{
someFlage.store(false);
if (cond1 && cond2)
{
performSomeAction();
}
}
我目前正计划像这样重写 if
语句:
if (std::atomic_exchange(&someFlag, false) &&
cond1 && cond2)
{
performSomeAction();
}
极其重要的是,在这条if
语句之后,someFlag
变量被设置为false
。
因此,我想确保对 atomic_exchange
的调用始终发生,而不管 cond1
和 cond2
的值如何。我可以保证会是这种情况吗,因为无论优化设置如何,布尔表达式都是从左到右求值的?
是的,订单有保证。来自 cppreference.com:
Every value computation and side effect of the first (left) argument of the built-in logical AND operator
&&
and the built-in logical OR operator||
is sequenced before every value computation and side effect of the second (right) argument.
在if (std::atomic_exchange(&someFlag, false) &&
cond1 && cond2)
std::atomic_exchange(&someFlag, false)
将首先被调用。如果评估为
true
,则评估为cond1
如果
cond1
为真,计算cond2
。最后
performSomeAction()
如果cond2
也是true
.