关闭 ||算子优化

Turn off || operator optimization

VS C++ 2017 中是否有任何选项,以便在构建以下程序时同时调用 f()g()

#include <iostream>
using namespace std;
bool f()
{
    cout << "f" "\n";
    return true;
}
bool g()
{
    cout << "g" "\n";
    return false;
}
int main()
{

    if (f() || g())
        cout << "hello";
    cin.ignore(1);
}

不,没有,这种行为(短路)基本上是逻辑运算符的一部分。

您可以改为使用按位或运算符 |。但请务必添加评论,说明这不是错误,而是故意的!

无论如何,如果您的函数调用不像 f() 那样简单,您应该考虑引入一个单独的变量(或多个变量),以便更清楚地表明您的代码在做什么(无条件调用两个函数,然后使用它们的 return 值)。

短路评估是语言规范的一部分。你不能把它关掉。 您可以将 f()g() 调用分配给变量,然后计算这些变量:

bool f_ret = f();
bool g_ret = g();
if (f_ret || g_ret)
    cout << "hello"; 

如果您至少有一个函数 return 一个定义了 operator|| 的 UDT:

#include <iostream>

struct my_bool
{
    bool value;
    my_bool(bool value) : value{ value } {}
    operator bool() const { return value; };
    my_bool operator||(my_bool rhs) const { return value || rhs.value; }
};

my_bool f()
{
    std::cout << "f()\n";
    return true;
}

my_bool g()
{
    std::cout << "g()\n";
    return false;
}

int main()
{

    if (f() || g())
        std::cout << "hello\n";
}

双方都会进行评估

但是。你。不。想。到。做。那.*)

*) 除非目标是编写混淆代码;)

可能最简单的解决方案是这样写:

if (f()+g())
    cout << "hello";

输出:

f
g
hello

运算符 + 没有任何 "short circuit evaluation"。从逻辑上讲,表达式 f() + g() 等同于 f() || g(),原因如下:运算符 + 的操作数被转换为整数值,其中 false 给出 0,并且true 给出 1f() + g() 的结果在 0..2 之间。由于此积分结果用在需要布尔值的地方,因此它会被转换回布尔值,因此 0 被视为 false,所有 >0 都被视为 true