关闭||操作员优化

时间:2018-11-02 22:00:50

标签: c++ short-circuiting

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);
}

4 个答案:

答案 0 :(得分:10)

短路评估是语言规范的一部分。您不能只是将其关闭。 您可以将f()g()调用分配给变量,然后求值:

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

答案 1 :(得分:2)

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

相反,您可以使用按位或运算符|。但是请确保添加评论,说明这不是错误,而是有意为之!

无论如何,如果您的函数调用不如f()那么简单,则应考虑引入一个或多个单独的变量,以使代码的作用更加明显(无条件调用两个函数,然后使用它们的两个返回值)。

答案 2 :(得分:2)

如果您至少有一个函数,则返回定义了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";
}

双方都会得到评估。

但是。您。别。想。至。做。那。 *)

*),除非目标是编写模糊代码;)

答案 3 :(得分:2)

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

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

输出:

f
g
hello

操作员+没有任何“短路评估”。逻辑上,表达式f() + g()f() || g()等效,原因如下:运算符+的操作数被转换为整数值,其中false给出0,并且true给出1。这样f() + g()的结果就在0..2之间。由于在需要布尔值的地方使用了该积分结果,因此将其转换回布尔值,从而将0视为false,并将所有>0视为true