簡體   English   中英

C ++按位OR運算符

[英]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的當前值從boolint (這是零,所以沒有什么特別之處),使用表達式int按位或運算,然后將最終的int降級為bool以存儲在res 我很驚訝這至少沒有標記編譯器的警告。

它可能應該是if (!res) res ||= expr ,即便如此,它也是毫無意義的,因為你可以在這個答案的頂部使用短路eval來完全切斷本地res 考慮resfalse 那么等價表達式將是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM