2016-04-28 8 views
0

私はコード内で論理演算と比較演算を行っていますが、単純化することができます。2つの論理演算と比較演算が等しいことを確認するにはどうすればよいですか?

は簡単に言えば、それは次のようになります。

if (!a || !(b || c)) {...} 

しかし、私はそれは

私はこのような状況で行う必要がありますどのように
if (!a || !b || !c) {...} 

と同じだと思いますか?私は対処しなければならない既存のコードで、このような操作をもっと見ることができると思います。手動チェック以外の操作を簡素化/最適化するルールはありますか?

+0

興味深いリンク:[De Morgans law](https://en.wikipedia.org/wiki/De_Morgan's_laws) – DenseCrab

+0

https://en.wikipedia.org/wiki/De_Morgan's_lawsあなたのトランスフォーメーションでは、 '&&' somewhere: "not(A or B)"は "(not A)and(not B)"と同じです。 – Thilo

答えて

1

あなたが得るためにDeMorgan's lawを適用することができます。

ため &&||よりも高い優先順位を持つのと同じである、
if (!a || (!b && !c)) {...} 

if (!a || !b && !c) {...} 

をしかし、全体の条件は非常に否定的と思われること、およびほとんどの場合、肯定的な条件を読む方が簡単です。おそらく、次のように書かれたほうがよいでしょう。

// This is the negation of your condition after applying DeMorgan's law 
if (a && (b || c)) { 
    // return or throw error 
} 

... // What you would've done in the if statement 
0

問題はif!(b || c)私たちと同じ!b || !c。 、単純な真理値表をお試しください:

b c !(b||c) !b||!c 
0 0 1   1 
0 1 0   1 
1 0 0   1 
1 1 0   0 

そこで彼らは同じではありません。ブールリファクタリングのこのタイプに近づいための一般的な手法として

0

、あなたは真理値表を構築する独自の能力を信頼していない場合、どのようにこれらの線に沿っていくつかのコードを書くことについて:

for a in {true, false} 
    for b in {true, false} 
    for c in {true, false} 
     if (!a || !(b || c)) <> (!a || !b || !c) 
     then exit with message "Not equivalent" 
    end 
    end 
end 

if条件缶もちろん、テストしようとしている2つの式に置き換えてください。

関連する問題