C ++按位OR运算符

时间:2013-01-14 05:50:40

标签: c++ bit-manipulation

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运算符?

1 个答案:

答案 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);