保证逻辑 AND 表达式中的函数调用

op4*_*414 10 c++ atomic stdatomic

我正在使用 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我目前正计划if像这样重写语句:

if (std::atomic_exchange(&someFlag, false) &&
    cond1 && cond2)
{
    performSomeAction();
}
Run Code Online (Sandbox Code Playgroud)

极其重要的是,在此if语句之后,someFlag变量设置为false。因此,我想,以确保调用atomic_exchange总是发生,无论价值cond1cond2。无论优化设置如何,布尔表达式都是从左到右计算的,我能保证会是这种情况吗?

Ren*_*nat 16

是的,订单是有保证的。从cppreference.com

内置逻辑 AND 运算符&&和内置逻辑 OR 运算符的第一个(左)参数的||每个值计算和副作用在第二个(右)参数的每个值计算和副作用之前排序。


Jar*_*d42 7

if (std::atomic_exchange(&someFlag, false) && cond1 && cond2)

  • std::atomic_exchange(&someFlag, false) 将首先被调用。

  • 如果评估为true,则评估cond1

  • 如果cond1为真,则评估cond2

  • 最后performSomeAction()如果cond2也是true