关闭 ||算子优化
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
给出 1
。 f() + g()
的结果在 0..2
之间。由于此积分结果用在需要布尔值的地方,因此它会被转换回布尔值,因此 0
被视为 false
,所有 >0
都被视为 true
。
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
给出 1
。 f() + g()
的结果在 0..2
之间。由于此积分结果用在需要布尔值的地方,因此它会被转换回布尔值,因此 0
被视为 false
,所有 >0
都被视为 true
。