位操作- c++位或运算符


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给res。

你能建议一种方法,我可以比较一个值从数据库表和返回true值res..你也可以解释什么是第二个if语句和按位或操作符?

先生,就让短路eval为您做这件事吧:

return dummyCache::instance().getVal(Id).getWhitelabelType() == "ABCD" ||
       dummyCache::instance().getVal(Id).getIsPlc() == 1;

如果第一个为真,第二个将不触发。此外,我向您保证,如果返回的对象在getWhitelabelType()getisPlc()调用之间没有更改,远程合理的优化编译器将不会重新触发instance().getVal(id)。事实上,如果getWhiteLabelType()const,我几乎可以保证它。(当然看起来应该是这样)。

关于钻头工作。这个表情几乎被破坏了。虽然它会起作用。除非我读错了(相信我,告诉我我是的人的列表会让我很快知道),它正在执行布尔eval,将结果的真/假bool提升到int,将res的当前值从bool提升到int(这是零,所以没有什么特别的),用表达式int按位or,然后将最终的int降回bool存储在res中。我很惊讶这没有在编译器上至少标记一个警告。

它可能应该是if (!res) res ||= expr,即使这样,它也是毫无意义的,因为你可以在这个答案的顶部使用短路eval来完全切断本地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);

最新更新