2016-08-10 9 views
1

は、次の点を考慮abcdboolになる式ですこのコードスニペットを書き直すと良い方法がありますか?

if ((a || b) && (c || d)) 
{ 
    if (a && c) {...} 
    else if (b && d) {...} 
    else {...} 
} 
else {...} 

コードから明らかなように、これらの式のいくつかは再計算されています。 a)明快さに関してより良いアプローチがありますか? b)効率性?

+4

をこの質問はあなたが心配何ですかcodereview.stackexchange.com – Doruk

+1

に、よりフィット感でしょうか?透明性または効率性? – TartanLlama

+0

@TartanLlamaクラリティが優先です。しかし効率面を知ることも大好きです – CinCout

答えて

2

簡単な答え:if文の前にbool変数で式を格納できます。

式に関数呼び出しが含まれていない場合(つまり、文の間で変更されないことが明らかな場合)、コンパイラはこのように最適化することを期待します。

6

サプライズ:あなたは実際に外側のifステートメントが必要と思わない。 (a && c)または(b && d)が真実であるならば、つまり

if (((a && c) || (a && d)) || ((b && c) || (b && d))) 

if ((a || b) && (c || d)) 

、その後、外ifは常にtrueと評価されます:外ifから書き換えることができるロジックの法則を使用することを理解します、それは落とすことができます。代わりに、あなたはこの記述することができます。

if (a && c) {...} 
else if (b && d) {...} 
else if ((a && d) || (b && c)) {...}  // your original 'inner' else 
else {...}        // your original 'outer' else 
+1

OPのバージョンがより効率的に見えます。 'c'と' d'が 'false'と評価されるとどうなりますか?元のフォームではブロック全体が最初の評価の後に破棄されますが、ここにはチェックされるべきelse文がいくつかあります。 – RHertel

+0

@RHertelあなたは効率を書くかもしれませんが、明快さの観点からは、私が与えた答え。 –

+1

@RHertelパフォーマンスとコンパイラの最適化については推測しないでください。上記のものは、そうでないことが証明されるまでは十分に速いです。 –