爵士,只是讓短路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