关闭||运算符优化

Turn off || operator optimization

本文关键字:优化 运算符 关闭      更新时间:2023-10-16

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()g()调用分配给变量,然后计算这些调用:

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

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

相反,您可以使用按位或运算符|。但一定要添加一条评论,说明这不是一个错误,而是故意的!

在任何情况下,如果函数调用不像f()那么简单,则应该考虑引入一个或多个单独的变量,以使代码执行的操作更加明显(无条件地调用两个函数,然后同时使用它们的返回值(。

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

双方都将接受评估。

但是。你不要。希望去。做。那样*(

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

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

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

输出:

f
g
hello

操作员+没有任何"短路评估"。从逻辑上讲,表达式f() + g()等价于f() || g(),原因如下:运算符+的操作数被转换为整数值,其中false给出0true给出1。则CCD_ 16的结果在CCD_ 17之间的范围内。由于该积分结果用于期望布尔值的地方,因此它被转换回布尔值,从而0被视为false,而所有>0都被视为true