2011-08-01 179 views
8

C++中有邏輯運算符&嗎?例如一個運算符,它的工作原理與& &一樣,只是它也評估後面的參數,即使前面的一些參數已經評估爲false?運營商&是我瞭解的按位和運營商。C++邏輯與運算符

+6

爲什麼你需要那個?對於我可以想象的所有用例,您應該修復混合邏輯條件和強制性副作用的混亂情況。 – delnan

+0

@Ziyao Wei - 再讀一遍:) at delnan - 我同意你的看法。 –

+0

@Kiril:Noticed;) –

回答

21

操作&的確是位運算符。我假設你有類似

if (f() && g()) { /*do something*/ } 

而您想要F()和G()來執行,不論是否那一個被評價爲假。我建議你做點別的:

bool bF = f(); 
bool bG = g(); 

if (bF && bG) { /*do something*/ } 

這也提供了更好的可讀性,不混淆其他程序員誰儘量保持你的代碼。從長遠來看,這是值得的。

+1

這是做到這一點的最佳方式。 –

+0

可以將'if(f()&& g())'改成'if((int)f()+(int)g()== 2)'這將強制兩個操作數進行求值。 – Nawaz

+3

如果f()和g()返回int會怎麼樣?如果f()返回-1並且g()返回1,那麼f()&& g()會產生true,而你的條件會產生假... –

1

沒有邏輯&,只能按位&

,如果你想避免邏輯語句的短路,則需要使用代理的將不被編譯器優化掉,以實現它(如可變參數元模板)。

0

如果您使用操作符重載& &,也不會短路。

struct Bool { 
    bool val; 
    Bool(bool f): val(f) {} 
    operator bool() { 
    return val;  
    } 
}; 


bool operator&&(Bool a, Bool b) { 
    return (bool)a && (bool)b; 
} 

裁判:點19,雖然因爲有提到在C++ FAQ lite

13.9節,這是一個非常糟糕的主意和迷惑人。儘管如果你有一個非常特殊的情況,你可能想以非常有限的方式來做。

+2

這是一件可怕的事情。 –

+0

我不會向任何人推薦:D –

+1

哇。這嚇壞了我從所有假設(正確)需要短路的代碼中引入的所有時髦副作用。 (例如,如果((a!= null)&&(a.foo = 123))...) – Joe

4

在C++中沒有這種「始終執行」的操作符。

我的第一個傾向是,而不是尋找一個新的運營商,你應該重新評估你的方法做什麼,以消除任何副作用,他們執行這一任務。通過這種方式可以簡單地使用&&並且很開心。

但是如果你真的想要做的序列中的所有操作,然後看看他們都成功,可能Luchian格里戈雷的回答將是最好的。它清楚地描述了它始終需要執行的順序步驟。還有一個選項可以或可以不那麼清楚:

// Each method needs to execute in sequence but we use "success" to track overall success. The order of operands to `operator&&` shouldn't be changed. 
bool success = f1(); 
success = f2() && success; 
success = f3() && success; 

if(success) ... 
+1

+1有用的技術學習。儘管我總是以「bool success = true」開頭;這樣所有的條件評估看起來都是一樣的。 –

+0

我使用'success&= f2();' – MSalters