2011-09-29 29 views
5

碰到一些使用了這個代碼的代碼,這讓我很想知道。C++:作爲條件語句的邏輯比較?

if(condition) foo = bar(); 

condition && (foo = bar()); 

這兩段代碼是否等於編譯器?如果不是,他們在哪些方面會有所不同?

+0

這樣的技術在這裏使用:[在不使用條件語句和三元運算符的情況下,在C中查找最多三個數字(http://stackoverflow.com/questions/7074010/find-maximum-of-three-number-in- c-without-using-conditional-statement-and-ternary) – Nawaz

+0

Nawaz - 這樣一個無用的家庭作業的優雅解決方案。 :P –

回答

1

除非&&目前超載的類型conditionfoo組合,他們將有相同的行爲 - 後者會以這種方式工作:

bool result; 
if(!condition) { 
    result = false; 
} else { 
    foo = bar(); 
    result = foo != 0; 
} 
and result gets ignored 

這是通常的短路 - 如果&&第一部分是false第二個是沒有評估。

IMO第二個變體的可讀性要差得多。

6

由於操作者precendence,後者被解釋爲:

(condition && foo) = bar(); 

另外,存在過載的&&的可能性,這可能導致相當多的東西。

簡而言之:它們根本不相等 - 至少在一般情況下。

+0

啊,你是對的!這是我的錯誤,儘管括號出現在我看到的代碼中。修正了問題 –

1

除非condition && foo評估爲左值,condition && foo = bar();是沒有意義的。

+0

對不起,我忽略了包括括號,它已被更正。用新代碼代替 –

0

存在編譯器錯誤:無效的l值。要具有相同的功能,您必須使用

conticion ? foo = bar() : <other accion>; 
+0

,它具有相同的含義 –

2

第一個版本只是一個普通的舊語句。

第二個版本是一個表達式,它將返回整個表達式的結果。這可能允許一些棘手的單行語法,像往常一樣,可能會使代碼更具可讀性,但由於陌生性,更可能使其更加複雜和更難以快速解析。

國際海事組織無論在任何地方一直使用它,以便您的代碼的讀者習慣它,或根本不使用它。

0

如果& &未過載爲既不條件也不FOO:

condition && (foo = bar()); 

將被視爲

(condition.operator bool()) && (foo = bar()); 

如果(condition.operator布爾())是不正確的,(FOO = bar())將不會被執行,反之亦然。