1
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 语句和按位 OR 运算符的作用吗?

4

1 回答 1

3

先生,让短路评估为您执行此操作:

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

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

关于钻头工作。表情几乎是一团糟。虽然它会工作。除非我读错了(相信我,会告诉我我的人的名单会很快让我知道)它正在执行布尔评估,将结果 true/falsebool提升为 an ,将fromint的当前值提升为(这是零,所以没什么特别的),用表达式按位或运算,然后将最终的 int 降级为 bool 以存储在. 我很惊讶这至少没有在编译器上发出警告。resboolintintres

它可能应该是if (!res) res ||= expr,即使那样,它也是没有意义的,因为你可以在这个答案的顶部使用短路评估来res完全切断本地。考虑如果resfalse。那么等价的表达式就是res = false || expr。但这只是res = expr。在!res它执行的状态下,你也可以只使用一个赋值。

最后,关于将第三个字段添加到您的评估中,这完全取决于您希望如何添加它。对于额外的逻辑 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);
于 2013-01-14T05:53:17.637 回答