[英]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
的當前值從bool
到int
(這是零,所以沒有什么特別之處),使用表達式int
按位或運算,然后將最終的int降級為bool以存儲在res
。 我很驚訝這至少沒有標記編譯器的警告。
它可能應該是if (!res) res ||= expr
,即便如此,它也是毫無意義的,因為你可以在這個答案的頂部使用短路eval來完全切斷本地res
。 考慮res
為false
。 那么等價表達式將是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.