【问题标题】:Guarantee function call in logical AND expression [duplicate]保证逻辑与表达式中的函数调用[重复]
【发布时间】:2020-05-01 01:24:01
【问题描述】:

我正在使用 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,而不管cond1cond2 的值如何。无论优化设置如何,布尔表达式都是从左到右评估的,我能否保证会出现这种情况?

【问题讨论】:

    标签: c++ atomic stdatomic


    【解决方案1】:

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

    第一个(左)的每个值计算和副作用 内置逻辑 AND 运算符 &amp;&amp; 和内置 逻辑或运算符|| 在每个值计算之前排序,并且 第二个(右)论点的副作用。

    【讨论】:

      【解决方案2】:

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

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

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

      • 如果cond1 为真,则评估cond2

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多