碰到一些使用了這個代碼的代碼,這讓我很想知道。C++:作爲條件語句的邏輯比較?
if(condition) foo = bar();
condition && (foo = bar());
這兩段代碼是否等於編譯器?如果不是,他們在哪些方面會有所不同?
碰到一些使用了這個代碼的代碼,這讓我很想知道。C++:作爲條件語句的邏輯比較?
if(condition) foo = bar();
condition && (foo = bar());
這兩段代碼是否等於編譯器?如果不是,他們在哪些方面會有所不同?
除非&&
目前超載的類型condition
和foo
組合,他們將有相同的行爲 - 後者會以這種方式工作:
bool result;
if(!condition) {
result = false;
} else {
foo = bar();
result = foo != 0;
}
and result gets ignored
這是通常的短路 - 如果&&
第一部分是false
第二個是沒有評估。
IMO第二個變體的可讀性要差得多。
由於操作者precendence,後者被解釋爲:
(condition && foo) = bar();
另外,存在過載的&&
的可能性,這可能導致相當多的東西。
簡而言之:它們根本不相等 - 至少在一般情況下。
啊,你是對的!這是我的錯誤,儘管括號出現在我看到的代碼中。修正了問題 –
除非condition && foo
評估爲左值,condition && foo = bar();
是沒有意義的。
對不起,我忽略了包括括號,它已被更正。用新代碼代替 –
存在編譯器錯誤:無效的l值。要具有相同的功能,您必須使用
conticion ? foo = bar() : <other accion>;
,它具有相同的含義 –
第一個版本只是一個普通的舊語句。
第二個版本是一個表達式,它將返回整個表達式的結果。這可能允許一些棘手的單行語法,像往常一樣,可能會使代碼更具可讀性,但由於陌生性,更可能使其更加複雜和更難以快速解析。
國際海事組織無論在任何地方一直使用它,以便您的代碼的讀者習慣它,或根本不使用它。
如果& &未過載爲既不條件也不FOO:
condition && (foo = bar());
將被視爲
(condition.operator bool()) && (foo = bar());
如果(condition.operator布爾())是不正確的,(FOO = bar())將不會被執行,反之亦然。
這樣的技術在這裏使用:[在不使用條件語句和三元運算符的情況下,在C中查找最多三個數字(http://stackoverflow.com/questions/7074010/find-maximum-of-three-number-in- c-without-using-conditional-statement-and-ternary) – Nawaz
Nawaz - 這樣一個無用的家庭作業的優雅解決方案。 :P –