bool OrderUtils::shouldCptyAutoexecute(int Id)
{
bool res =
dummyCache::instance().getVal(Id).getWhitelabelType() == "ABCD";
if (!res)
res |= dummyCache::instance().getVal(Id).getIsPlc() == 1;
return res;
}
如果数据库中存在任何id,上面的代码将检查2 Id并返回true。
你能建议一种方法,我可以比较数据库表中的另一个值,并返回true res值。还可以解释第二个if语句做什么和按位OR运算符?
答案 0 :(得分:3)
return dummyCache::instance().getVal(Id).getWhitelabelType() == "ABCD" ||
dummyCache::instance().getVal(Id).getIsPlc() == 1;
如果第一个为真,则第二个不会触发。此外,我向您保证,如果返回的对象在instance().getVal(id)
和getWhitelabelType()
调用之间没有更改,则远程合理的优化编译器将不会重新启动getisPlc()
。事实上,如果getWhiteLabelType()
为const
,我会全部保证。 (当然看起来应该是这样)。
关于位工作。表达非常糟糕。虽然它会起作用。除非我读错了(并且相信我,会告诉我的人员名单会让我快速通知)它正在执行布尔值,将结果的真/假bool
提升为int
},将res
的当前值从bool
提升为int
(这是零,所以没有什么特别之处),使用表达式int
对其进行按位运算,然后将最终的int降级为bool以存储在res
中。我很惊讶这至少没有标记编译器的警告。
它可能应该是if (!res) res ||= expr
,即便如此,它也毫无意义,因为您可以像在本答案的顶部一样使用短路评估来完全切断本地res
。考虑res
是否为false
。然后等效表达式为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)
(好吧这有点过分了......)
return (dummyCache::instance().getVal(Id).CField() == CTestValue)
? (dummyCache::instance().getVal(Id).AField() == ATestValue)
: (dummyCache::instance().getVal(Id).BField() == BTestValue);