1

コードに次の行があります。

    if (command.equals("sort") && args.length == 2) {
    //run some program
    }

引数の長さが正しいかどうかに関係なく、コマンドが "sort" と等しくない場合、if他のステートメントを評価する必要がないため、2 つの別々のステートメントを使用する必要があると誰かが提案しています。if

それによると、コードを次のように書き直す必要があります。

if (command.equals("sort")) {
  if (args.length == 2) {
    //run some program
  }
}

私はどちらも仕事をしていることを知っていますが、私の質問はどちらがより優れていて効率的ですか?

4

9 に答える 9

14

いいえ、そうではありません。short circuit最初の条件が false と評価された場合、2 番目の条件はまったく評価されません。

于 2012-12-12T20:08:17.100 に答える
7

まあ、以来&&short-circuit演算子です。したがって、両方のifステートメントは事実上同じです。

したがって、最初のケースでcommand.equals("sort")、 が false を返す場合、次の条件はまったく評価されません。したがって、私の意見では、最初のものを使用してください。より明確です。

于 2012-12-12T20:08:22.123 に答える
2

前述のように、短絡により、条件が失敗した瞬間にプログラムがifステートメントを終了します。つまり、それ以上の条件は評価されないため、2つの形式の評価方法に実際の違いはありません。

複数のifステートメントが相互にネストされていると、コードの読みやすさに悪影響があります。これが、ネストしない主な理由です。例えば:

if( conditionA && conditionaB && !conditionC ){
    // Do Something
}

よりもはるかにきれいです:

if( conditionA ){
    if( conditionB ){
        if( !conditionC ){
            // Do Something
        }
    }
}

20個のネストされたifステートメントがあると想像してみてください。確かに、一般的なことではありませんが、可能です。

于 2012-12-12T20:33:18.880 に答える
1

値のnullケースをチェックし、そのオブジェクトに関数を適用する場合、 && によって行われる短絡の方が優れています。短絡演算子はうまく機能します。条件 1 が false の場合、実行される条件 2 から停止します。

元:

String s=null;

if(s!=null && s.length())

これは例外をスローしません。また、ほとんどの場合、チェックする場合はもう 1 つ保存します。

于 2012-12-12T20:16:32.980 に答える
1

それらは同じです。最初の例では、最初の式が false の場合、最新のランタイムは 2 番目の式を無視します。

于 2012-12-12T20:09:42.713 に答える
0

実際には、[Lazy_evaluation] と呼ばれます: http://en.wikipedia.org/wiki/Lazy_evaluation

于 2012-12-12T20:22:30.730 に答える
0

それは実際の問題ではありませんが、評価された場合に2つが必要な場合は、 & を使用できることに注意してください。

if (methodA() & methodB()) {
    // 
}

それ以外の

boolean a = methodA();
boolean b = methodB();
if (a && b) {
    //
}
于 2012-12-12T20:31:12.177 に答える
0

条件が同じ順序であれば、効率という点ではまったく同じです。

if (command.equals("sort") && args.length == 2)

command.squals("sort") が false を返し、args.length がチェックされない場合はドロップアウトします。それshort-circuit&&オペレーターの操作です。

結局のところ、スタイルと読みやすさの問題です。IMO 1 つのifステートメントで連鎖しすぎると、読みにくくなる可能性があります。

于 2012-12-12T20:13:11.017 に答える
-1

ええ、彼らの提案は完全に正しいです。私が提案するのは、最初のチェックを次のように書くことです。

"sort".equals(command)

たぶん、この場合は意味がありませんが、将来的には意味がありません。最初に静的タイプを使用して、前にnullチェックが必要になることはありません

于 2012-12-12T20:33:11.737 に答える