繁体   English   中英

C ++按位OR运算符

[英]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的当前值从boolint (这是零,所以没有什么特别之处),使用表达式int按位或运算,然后将最终的int降级为bool以存储在res 我很惊讶这至少没有标记编译器的警告。

它可能应该是if (!res) res ||= expr ,即便如此,它也是毫无意义的,因为你可以在这个答案的顶部使用短路eval来完全切断本地res 考虑resfalse 那么等价表达式将是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM