关闭||运算符优化
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()
和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
给出0
,true
给出1
。则CCD_ 16的结果在CCD_ 17之间的范围内。由于该积分结果用于期望布尔值的地方,因此它被转换回布尔值,从而0
被视为false
,而所有>0
都被视为true
。
相关文章:
- 空基优化子对象的地址
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- 运算符重载关联性编译器优化
- 为什么三元运算符阻止返回值优化
- C++对间接运算符的标准描述是否保证内存写入不会被优化掉
- 如果二进制运算符+重载的返回值是const,它会干扰优化吗
- "null logger" - 带有 ostream 运算符的空类会从优化的代码中编译出来吗?
- 优化三元运算符
- C/ c++编译器会对交换运算符(例如:+,*)重新排序以优化常量吗?
- 在代码优化中使用new运算符是否值得?