2017-01-31 13 views
1

1行のif文を同じ意味の複数行のif文に分割しようとしています。私が持っている:複数のif文を複数のif文に分割する

if(a || (b && c)) 
{ 
    /* do smt */ 
} 

が、私は

if(a) 
{ 
    if(b) 
    { 
    if(c) 
    { 
     /* do smt */ 
    } 
    } 
} 

感謝のと同じ意味で

if(a && b && c) 
{ 
    /*do smt*/ 
} 

を持っているかのようなものに変更したいと思います!

+4

なぜこれをやりたいですか? 'a'、' b'、 'c'の条件が長すぎる場合は、短くてわかりやすい名前のメソッドを書くことを検討してください。 'if(isLoggedIn(user)||(isGuest(user)&& guestCanEdit(topic)))' –

+1

あなたの質問は何ですか?理解できませんでした。 – Rohit

+0

私は、より明確になるように質問の拡張版を書くつもりです。したがってif文は '(list.isEmpty()|| list.isEmpty()&& list.getLast()。compareTo(heap.peek()。value)<= 0)' となります。ループの中で実行されます。私がここでやろうとしているのは、 'compareTo()'メソッドがどのように呼び出されたかを数えることです。もっと正確にカウントするためにif文を分割する必要があります。 – henrich

答えて

0

はい、これを行うことはできますが、おそらくそうしないでください。


if (a && b) statement;

if (a){ 
    if (b){ 
     statement;  
    } 
} 

とまったく同じです。しかし同じことがif (a || b)のために言うことができません:あなたは複数の場所でstatement;を記述する必要があると思います:

if (a){ 
    statement; 
} else if (b){ 
    statement; 
} 

つまり、||も短絡性と、&&横切っを配布:だから

if (a || b && c/*redundant parentheses removed*/){ 
    statement; 
} 

if ((a || b) && (a || c)){ 
    statement; 
} 

のように書くことができる

を上方から、である、

if (a || b){ 
    if (a || c){ 
     statement; 
    } 
} 

これは、不必要にob fuscated、あなたが望むものです。

0

これの必要性は非常に明確ではありませんが、あなたはこれを行うことができます:関数内でそれを行います。

function codeToDo() { 
    // your code to execute on condition 
} 

if (a) { 
    codeToDo(); 
else if (b) { 
    if (c) { 
    codeToDo(); 
    } 
} 
0
if(a || b) 
{ 
    if(a || c){ 
    /* do smt */ 
    } 
} 

がさらにif(a||b)一部を処理するために、適用されます。

if(a){ 
    /*do task1*/ 
}else if(b){ 
    /*do task1*/ 
} 

if(a)else if(b)では、同じコードを実行していることに注意してください。タスク1。

+0

複雑な計算が必要な場合、2回の評価を処理しますが、あまり効果的ではありません。また、副作用が起こると間違っている場合は間違っています。 – Aziuth

1

ブール代数は、このcondiitonに

オンにすることができ|| (& & C B)(|| b)の& &(|| C)

ので、あなたのよう気にいらを行うことができます

へ:あなたはできません

if(a || b) 
{ 
    if(a || c){ 
    /* do smt */ 
} 
} 
+0

これはまさに私が探していたものだと思います!ありがとう! – henrich

+0

ああ...とても良い!!どういたしまして!!! :) –

+0

@henrich最初の条件は 'if(list.isEmpty()||!list.isEmpty())'です。あなたの特定のケースでは、外側の 'if'はまったく必要ありません。 –

1

ifブロックの本文を繰り返さずに実際にこれを行います。 a || b!(!a && !b)に変換できますが、&&を使用していますが、!(...)のため、これを入れ子にしてifのステートメントに分割することはできません。

なぜこれを最初にやりたいのですか?私の仮定は、3つの条件a,bおよびcは非常に長く、および/または複雑であるということであろう。

  • は、わかりやすい名前を持つ3つのブール変数を宣言して

    boolean isLoggedIn = // some really long data base lookup 
    boolean isGuest = // more data base stuff 
    boolean guestCanEdit = // a complex boolean expression 
    if (isLoggedIn || (isGuest && guestCanEdit)) { ... 
    
  • は、上記のチェックを実行する3つのメソッドを定義した状態のものを使用します。このような場合は、私は、次のいずれかをお勧めしたいですそしてhowev、if

    if (isLoggedIn(user) || (isGuest(user) && guestCanEdit(topic))) { ... 
    

注意のものを使用します最初のバージョンが短絡を使用しない、すなわち、最初のバージョンが既に真であるか、または2番目が偽であっても、すべての条件が評価されることになる。これは、計算上高価なもの、例えば、 3番目のチェックが成功した場合のみ(たとえば、nullチェック後)、


あなたcommentに関して:条件

if (list.isEmpty() || 
     (!list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0)) 

が本当にそんなに長くないが、それははるかに短いその方法を取得することはできませんように私は、このために上記のいずれかの方法を示唆しています。しかしb部分が冗長なので、を短くすることができます。 ||(b && c)の短絡に!a場合にのみ評価され、そしてあなたのb!aあるので、あなたの目標はどのように多く数えることであるならば、あなたはちょうどa || c

if (list.isEmpty() || list.getLast().compareTo(heap.peek().value) <= 0) 

それを短縮することができます回と呼ばれるcompareTo、あなたはこれを使用することができます。

if (! list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0) 

を今これはwが、ちょうどb && cです完全に欠けている部分があります。これはもうa || (b && c)に相当ないであることに注意してください、しかしaはすでにtrueと評価された場合により再び短絡に、compareToが実際a || cで呼ばれることはないので、この場合には、良いことだという。

+0

これは本当に@tobias_k '(list.isEmpty()|| list.getLast()。compareTo(heap.peek()。value)<= 0)'の方が良い解決法です。 '?|' conditionがあるので 'compareTo()'が(ループの中で)何回呼び出されたのかを数える方法がわからない:/? – henrich

+0

@henrich私の編集を参照してください。 –