2017-01-13 4 views
1

ifステートメントに複雑な条件があり、何らかの理由でそれがうまくいかない。複雑なIFステートメントの問題

if (
    (statementA1) || 
    (statementA2) && 
    (statementB) && 
    (statementC) 
) { 
    doSomething 
} 

A1A2の両方が(理由は、実際のステートメントの性質)が同時にtrueにすることはできません。 また、BCの両方は、全体的に真となるように真であると評価する必要があります。 true false true truefalse true true trueの場合はtrueを返す必要があります。他の置換はfalseを返します。

内部の複雑さ(Math.abs(),およびBに内部の結合されたサブステートメントが含まれているため)が中括弧で囲まれています。

+0

演算子の優先順位が難しい場合は、ブロックを複数の入れ子に分割することができます。しかし、はい、論理ANDはORよりも優先順位が高くなります。 – dfsq

+2

'a || b && c'は 'a || (b && c) 'である。 – melpomene

+0

あまりにも複雑ではない、この問題ではあまりにも固定されています(この週3回のような同じfeauterを書き直しました)。内部に何かを入れ子にすることなく、それ自体はかなり嫌です。 –

答えて

4

a1 a2 b  c result 
----- ----- ----- ----- ------ 
true false true true true 
false true true true true 
true true true true true <- different from blow 

のためには、この式

(a1 || a2) && b && c 

どちらかa1またはa2bcを使用することができます。

あなたはケース

a1 a2 b  c result 
----- ----- ----- ----- ------ 
true false true true true 
false true true true true 
true true true true false <- different from above 

を持っているなら、あなたはこれを使用することができ

(5)logical OR ||上(6)のでlogical AND &&operator precedenceの括弧が必要

if ((statementA1 || statementA2) && statementB && statementC) { 
    // doSomething 
} 

(!a1 && a2 || a1 && !a2) && b && c 

これは、a1a2を別々にチェックします。

if ((!statementA1 && statementA2 || statementA1 && !statementA2) && statementB && statementC) { 
    // doSomething 
} 
+0

A1は部分的にA2は完全に同じ論理的性質を持つ文字列を保持する同じオブジェクトプロパティを指しますが、テスト済みニーナの解決策とそれは私に適切な結果を与えた。ありがとうございました。 –

2

は、頭字語を覚えている、またはPEMDAS、括弧、べき乗、乗算/除算を参照し、加算/減算「私の親愛なるおばさんサリーを許しなさい」。これは、JavaScriptを含む多くの言語で、より高い(厳しい)から低い(緩い)順の優先順位です。

「私のおばあさんをお待ちください」(PEMA)です。

次に、論理的な世界でandは乗算のようなものであり、orは追加のようなものです。そうすれば、(&&)または(||)よりも厳密にバインドすることができます。あなたがandする場合は

したがって、2つの条件をINGの「自体or二つの条件であり、そのうちの一つ、あなたは後者を括弧必要があります。括弧なし

a && (b || c) 

、それは

として解釈されます
(a && b) || c 

もちろん、あなたの特定のケースでは、単に

を書き込むことによって、優先順位と括弧の心配を避けることができます
関連する問題