先生,让短路评估为您执行此操作:
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 以存储在. 我很惊讶这至少没有在编译器上发出警告。res
bool
int
int
res
它可能应该是if (!res) res ||= expr
,即使那样,它也是没有意义的,因为你可以在这个答案的顶部使用短路评估来res
完全切断本地。考虑如果res
是false
。那么等价的表达式就是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);