2017-01-15 11 views
-2

私は先日 "else-if"ステートメントの作成について考えていたし、その実行方法が各イベントを相互排他的に保証する理由についても考えていました。例えばelse-ifのように構造化するのはなぜですか?

if(condition A) 
    //condition 
else if(condition B) 
    //will run if condition A is false and condition B is true 
else if(condition C) 
    //will run if condition A is false and condition B is false and condition C is true 
else if(condition D) 
    //will run if all the above conditions are false and condition D is true. 

私はすべての「他」の文をチェックするために、条件Aが成立しない場合には、より多くの意味になるだろう、と思うだけではなく、どちらかBかCに該当する場合、停止します。

if(condition A) 
    //condition 
else { 
    if(condition B) 
    //... 
    if(condition C) 
    //... 
    if(condition D) 
    //... 
} 

したがって、なぜ我々は他の-場合は定義しない私たちはやり方を:私の直感では、上記のコードはこれに相当する持っているより自然だろうと考えて? if-elseステートメントの不要な入れ子を回避することはできますか?私はそれがあいまいだと思って、それを私の2番目のコードスニペットと同等にするのが理にかなっています。

編集:混乱を解消するために、私はこれら2つのステートメントが必ずしも同等ではないことを完全に理解しています。私の質問は主に最初の文が常に2番目の文と同じではないようにelse-ifが定義されている理由を尋ねています。私はなぜそれがそうするのかを理解しようとしています。

編集2:私は最終的に私の質問の基本的な本質を理解すると思います。一般に、 "else"は上記のステートメントが偽であるかどうかをチェックし、そうであればステートメントを実行します。しかし、elifの場合、実行前に上記の文がすべて偽であるかどうかをチェックします。これは、徹底的ではなく、if-else自体の性質について尋ねるので、重複する質問とは異なります。

編集3:私はうまくいけば明確な新しい質問を開きました。hereが見つかりました。

+0

ネスト化されたアプローチを使用することを誰も止めません。 – shmosel

+3

条件B、C、およびDが互いに排他的でない場合、コードフラグメントの実行結果は異なります。 – DyZ

+0

彼らはいつも同じではありません。 – Maroun

答えて

2

条件をテストするときに、相互排除の有無を確認することが1つのスタイルを好む理由です。

最初のシナリオでは、唯一の条件Bは、火災になる条件B、C、又はDが互いに相互排他的ではない場合、その後...

  • ...である場合else ifステートメントの相互排他性に変換します。
  • ... ifステートメントのためにではなく、ではないという事実のために、条件B、C、およびDが発生します。

最終的には、あなたが何をしたいかによって異なります。 このように複数のステートメントを実行したいことがあります。ただし、はおそらくではありません。互いに排他的な方法でステートメントをファッション化することで、期待していない結果や状態が発生したときに、奇妙な論理的なバグに遭遇することはありません。

+0

これは役に立ちます、ありがとう!だから入れ子の代わりに、本質的に相互排他性を強制するよりエレガントな方法ですか? – rb612

+0

@ rb612:私はほとんどの場合、 'return'か' break'(あなたが結果に何をしているかによる)による 'switch 'が多くの場合それを明確にするのに役立つと主張します。しかし、このシナリオでは、やはりロジックに欲しい、またはしなければならないことに本当に依存します。私はあなたが*相互に排他的なイベント(したがって最初のパターン)を望んでいるプロと趣味の開発で見ましたが、2番目のパターンはその場所を持っています。 – Makoto

1

あなたのネスティングアプローチを取り、それを一貫して適用する場合は、実際にこの思い付くでしょう:

if (condition A) { 
    // A 
} else { 
    if (condition B) { 
     // B 
    } else { 
     if (condition C) { 
      // C 
     } else { 
      if (condition D) { 
       // D 
      } 
     } 
    } 
} 

ifが同じように扱われます。最初のifステートメントには、他のすべてのifステートメントからelseブロックを削除する特別な機能はありません。あなたが提案する文法は、elseに一貫性のない意味を与えます。

+0

さて、私はあなたが私の質問の本質に慣れてきたと思う - 「else」は、通常、上記の文が偽であれば実行しますが、elifの場合は、「上記の文がすべて偽であれば、実行する "。 – rb612

0

基本的な例を考えてみましょう。

は、あなたが学生とスコアのスコアに応じてグレードがそれはB Gradeを出力します60

if(score <= 50) { 
    System.out.println("C Grade"); 
} else if(score <= 70) { 
    System.out.println("B Grade"); 
} else if(score <= 100) { 
    System.out.println("A Grade"); 
} 

ある賞にしたい、とします。

if(score<=50) { 
    System.out.println("C Grade"); 
} else { 
    if(score <= 70) { 
     System.out.println("B Grade"); 
    } 
    if(score <= 100) { 
     System.out.println("A Grade"); 
    } 
} 

ここでは、条件が互いに排他的ではない上記のアプローチに従っているかどうかを示します。 B GradeA Gradeが正しく表示されません。

したがって、ifの条件が互いに排他的でない場合、問題が発生します。だから、if..elseの入れ子が必要です。

+0

間違いなく、あなたの答えに感謝します。私はそれらが異なっていることを理解しています、私はちょうど最初の例が2番目の例のように正確に動作しない理由を疑問視していました(もし言語がelseを扱う方法のため) – rb612

+0

あなたの答えと編集をありがとう。質問に私の編集を見てください、私はそれが私が理解していないものを明確にするのに役立つと思うので、 – rb612

+0

ええ、あなたが最後に理解したのは正しいです。 'else'は上記の条件が満たされていないことを確認して実行しますが、' else..if'は上記のすべての条件が満たされていないことをチェックします。 :) –

関連する問題