2017-05-05 7 views
0

このコードではforループ条件で& &を使用しています。それは4回反復され、その結果「合計= 20」となる。 & &条件の左側が真であるため、右側が偽になるとループが終了するので、5回反復すると思います。Java短絡混乱

基本的に私の質問は、「sum = 30」を作るのに4回ではなく5回繰り返すのですか?ありがとう

`int[] lst = {1,2,3,4,5,4,3,2,1}; 
    int sum = 0; 
    for (int frnt = 0, rear = lst.length - 1; 
      frnt < 5 && rear >= 5; frnt++, rear--){ 
     sum = sum + lst[frnt] + lst[rear]; 
     System.out.println("frnt: " + frnt); 
     System.out.println("rear: " + rear); 
     System.out.println(); 
    } 
    System.out.print(sum);` 
+2

&&は*と*です。つまり、*両方の条件がtrue *である必要があり、falseの場合は条件が失敗します。 *これとAND *はどちらも真でなければなりません。 –

+0

私は「両方の条件が真でなければならない」と思っていました。 &&は短絡で、 'と'は最初のものが真であれば2番目のものを評価しません。それは私がとにかく学んだものです。 – physicalhacker

+2

これは、|| (または)。 &&の場合、短絡とは、最初の式がfalseの場合、式全体がすでに偽であるため、2番目の式を評価しないことを意味します。 – clcto

答えて

0

表現が全体的に分かっている場合にのみ短絡が発生します。

論理AND演算子(& &)の場合は、左辺がすでに偽である場合、式全体がすでに偽であるため、右辺が評価するものは関係ありません。左辺が真の場合、右辺の値によって式の値が決まります。それが評価されるまでは分かっていないので評価する必要があります。

論理OR演算子(||)の場合は、その逆です。式の左辺が真の場合、右辺が何であるかは関係ありません。式は真であるため、右辺は評価されません。左側がfalseの場合、式の値は右側に依存するため、評価する必要があります。

+0

ああ...私は2つのアイデアを混ぜた。どうもありがとうございました! – physicalhacker

0

この問題は、forの条件内で発生しています。ループの最後の反復では、frnt = 4rear = 4の両方です。条件frnt < 5は機能しますが、rear >= 5はfalseであり、式全体がfalseになり、ループが中断されます。各反復後の変数については、以下を参照してください(ループの本体が実行され、変数が変更されるたびに、変数表が表に示されています)。

   frnt rear 
before loop: 0  8 
iteration 1: 1  7 
iteration 2: 2  6 
iteration 3: 3  5 
iteration 4: 4  4 <---- Loop breaks after this 

2つのカウンタは4の中央で一致しますが、条件にはrear >= 5が指定されています。 、正しい動作を取得する条件を変更するために:frnt < 5 && rear >= 4、またはより明確---- rearfrnt <= 4 && rear >= 4

+0

ありがとうございます! – physicalhacker

0

frnt ---------- frnt < 5 && rear >= 5

0 ---- ------- 8 ------------------- true && true -> true

1 ----------- 7 ----- -------------- true && true -> true

2 ----------- 6 ------------------- true && true -> true

3 ----------- 5 ------------------- true && true -> true

4 ----------- 4 ------------- ------ true && false -> false

すべてが正しく、4回繰り返され、それだけです。

あなたは短絡の原理を誤解していると思います。次のように短絡原理が働く& &オペレータの場合:両方のオペランドが、オペランドAを評価し、それがfalseであることを発見する際にその後trueある場合

& & B操作の結果としてだけ場合にtrueありますオペランドBの値を評価してチェックする必要はありません。オペランドAがtrueの場合、常にオペランドBが評価されます。したがって、あなたのケースでは、ループがオペランドAを破るときにチェックが行われ、Aは4 < 5、オペランドBは4 >= 5です。したがって、オペランドAがtrueであるとき、オペランドBが評価され、チェックされることが必須であり、両方のオペランドが評価されるので、このケースは短絡ではない。オペランドAがfalseで、オペランドBが評価されていない場合、短絡回路が1になります。

+0

ありがとうございました! – physicalhacker