2011-09-29 17 views
5

これを使用しているいくつかのコードに跨っていると、私は不思議に思っていました。C++:条件文との論理比較?

if(condition) foo = bar(); 

condition && (foo = bar()); 

これら2つのコードセグメントはコンパイラと同じですか?そうでない場合は、どのように違うでしょうか?

+0

このような手法が使用されています:[条件文と三項演算子を使用せずにCで最大3つの数字を検索](http://stackoverflow.com/questions/7074010/find-maximum-of-three-number-in- c-without-using-conditional-statement-and-ternary) – Nawaz

+0

Nawaz - そのような役に立たない宿題のためのそのようなエレガントな解決策。 :P –

答えて

1

&&が、彼らは同じ振る舞いを持つことになりますconditionfooの種類の組み合わせのために、オーバーロードされない限り、 false秒は評価されません。

IMO第2の亜種は読みにくいです。

6

によりオペレータも優先し、後者は以下のように解釈される:

(condition && foo) = bar(); 

また、&&が過負荷される可能性はかなりのものにつながる可能性が、存在します。

要するに、それらはまったく同じではありません。少なくとも一般的にはそうです。

+0

ああ、そうです!それは私の間違いでしたが、括弧は私が見たコードにあります。質問を修正しました –

1

condition && fooは、左辺値と評価されない限り、condition && foo = bar();は無意味です。

+0

申し訳ありませんが、かっこは無視されました。修正されました。 –

0

コンパイルエラーがあります。l値が無効です。同じ機能を使用する必要があります

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

新しいコードでは、同じ意味を持ちます –

2

最初のバージョンは単なる古い文です。

第2のバージョンは、式全体の結果を返す式です。これはおそらく、たいていの場合、コードを読みやすくする可能性がありますが、不慣れなために構文解析をより複雑にし難くするような複雑な1行の構文を可能にします。

IMOは、コードの読者が慣れ親しんだり、まったく使用しないように、どこでも一貫して使用します。 &&の最初のコンポーネントがある場合 - 短絡普通だ

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

:後者はこのように動作します -

0

& &は、条件やfooのでもないため、オーバーロードされていない場合:(condition.operatorブール値は、())(FOO、真実でない場合

condition && (foo = bar()); 

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

として扱われます= bar())は実行されず、逆も同様です。