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);
}
答案 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
。