爵士,只是让短路EVAL为你做这个:
return dummyCache::instance().getVal(Id).getWhitelabelType() == "ABCD" ||
dummyCache::instance().getVal(Id).getIsPlc() == 1;
如果第一个是真实的,第二个将不火。此外,我向你保证一个远程合理的优化编译器不会重新火instance().getVal(id)
如果返回的对象不是getWhitelabelType()
和getisPlc()
调用之间改变。实际上,如果getWhiteLabelType()
是const
,我会全部保证。 (而且它看起来应该是)。
关于一些工作。这个表情非常 - 很厉害。尽管它会起作用。除非我读错(和信任我的人的名单,会告诉我,我就会让我很快知道)它正在执行一个布尔EVAL,促进产生真/假bool
到int
,促进res
当前值从bool
到int
(它是零,所以没有什么特别的有),按位的OR-ing,与表达int
,然后降级最终诠释回一个bool在res
来存储。我很惊讶,这并没有标示出编译器的至少一个警告。
它很可能应该是if (!res) res ||= expr
,即使如此,它也是毫无意义的,因为您可以在此答案的顶部使用short circuit eval来完全删除本地res
。考虑如果res
是false
。那么等效表达式将是res = false || expr
。但那只是res = expr
。在它执行的!res
状态中,您不妨使用赋值。
最后,关于增加第三场你的eval,这完全取决于你想要的补充。为了一个额外的逻辑OR,它非常简单。
对于像(A ||乙|| 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);
如果我不知道更好,我还以为这是Java的。你可以通过使用一个容器来简化它,就像一个关联数组。 – Rapptz
@ user1931177,你想比较3个字段,对不对? – billz
第三个比较与逻辑与操作相结合,如(A || B)&& C,或者它只是第三个逻辑OR条件,A || B || C。 ?换句话说,请指定您希望用第三个字段建立的逻辑布尔条件。 – WhozCraig