[英]C++ bitwise OR operator
bool OrderUtils::shouldCptyAutoexecute(int Id)
{
bool res =
dummyCache::instance().getVal(Id).getWhitelabelType() == "ABCD";
if (!res)
res |= dummyCache::instance().getVal(Id).getIsPlc() == 1;
return res;
}
上面的代码检查2 Id,如果数据库中存在任何id,则返回true。
你能建议一种方法,我可以比较数据库表中的另一个值,并返回true res值。还可以解释第二个if语句和按位OR运算符是什么?
先生,让短路评估为您做到这一点:
return dummyCache::instance().getVal(Id).getWhitelabelType() == "ABCD" ||
dummyCache::instance().getVal(Id).getIsPlc() == 1;
如果第一个是真的,第二个不会开火。 此外,我向你保证,如果返回的对象在getWhitelabelType()
和getisPlc()
调用之间没有改变,那么远程合理的优化编译器将不会重新触发instance().getVal(id)
。 事实上,如果getWhiteLabelType()
是const
,我会全部保证。 (当然看起来应该是这样)。
关于位工作。 表达非常糟糕。 虽然它会起作用。 除非我读错了(并且相信我,会告诉我的人员列表会让我快速通知)它正在执行布尔值,将结果的真/假bool
提升为int
,提升res
的当前值从bool
到int
(这是零,所以没有什么特别之处),使用表达式int
按位或运算,然后将最终的int降级为bool以存储在res
。 我很惊讶这至少没有标记编译器的警告。
它可能应该是if (!res) res ||= expr
,即便如此,它也是毫无意义的,因为你可以在这个答案的顶部使用短路eval来完全切断本地res
。 考虑res
为false
。 那么等价表达式将是res = false || expr
res = false || expr
。 但那只是res = expr
。 在执行的!res
状态中,您也可以使用赋值。
最后,关于向您的eval添加第三个字段,它完全取决于您希望如何添加它。 对于一个额外的逻辑OR,它非常简单。
对于像(A || B || C)这样的表达式,你可以
return dummyCache::instance().getVal(Id).AField() == ATestValue ||
dummyCache::instance().getVal(Id).BField() == BTestValue ||
dummyCache::instance().getVal(Id).CField() == CTestValue;
对于更复杂的操作,明智地使用括号将会有很长的路要走。 例如,要返回(A || B) && C
:
return (dummyCache::instance().getVal(Id).AField() == ATestValue ||
dummyCache::instance().getVal(Id).BField() == BTestValue) &&
dummyCache::instance().getVal(Id).CField() == CTestValue;
或者(A && C) || (B && !C)
(A && C) || (B && !C)
(好的,这有点过分...)
return (dummyCache::instance().getVal(Id).CField() == CTestValue)
? (dummyCache::instance().getVal(Id).AField() == ATestValue)
: (dummyCache::instance().getVal(Id).BField() == BTestValue);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.