2017-05-05 2 views
0

Dieser Code verwendet & & im For-Schleife-Zustand. Es iteriert 4 mal, was zu der Antwort "sum = 20" führt. Ich würde denken, dass es 5 Mal iteriert, da die linke Seite der & & Bedingung wahr ist, wenn die rechte Seite, die falsch wird, die Schleife beendet.Java Short Circuit Confusion

Grundsätzlich ist meine Frage, warum es iteriert 4 mal und nicht 5, so dass die "Summe = 30"? Danke

`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

&& ist * und *, was bedeutet, dass * beide Bedingungen wahr sein müssen *, und wenn beide falsch sind, wird die Bedingung fehlschlagen. * Dies UND das * muss beides wahr sein. –

+0

Ich dachte "beide Bedingungen müssen wahr sein" war für &. && ist ein Kurzschluss 'und' was bedeutet, wenn der erste wahr ist, wird der zweite nicht ausgewertet. Das habe ich sowieso gelernt. – physicalhacker

+2

Das würde für || gelten (oder). Für && bedeutet Kurzschließen, dass, wenn die erste falsch ist, die zweite nicht ausgewertet wird, weil der gesamte Ausdruck bereits falsch ist. – clcto

Antwort

0

Kurzschließen geschieht nur, wenn der Wert des gesamten Ausdrucks bereits bekannt ist.

Für den logischen UND-Operator (& &) wenn die linke Seite bereits falsch ist, dann ist es egal, was die rechte Seite berechnet, weil der ganze Ausdruck bereits falsch ist. Wenn die linke Seite wahr ist, dann bestimmt der Wert der rechten Seite den Wert des Ausdrucks. Da es bis zur Auswertung nicht bekannt ist, muss es ausgewertet werden.

Für den logischen ODER-Operator (||) ist das Gegenteil der Fall. Wenn die linke Seite des Ausdrucks wahr ist, dann ist es egal, was die rechte Seite ist, der Ausdruck ist wahr, also wird die rechte Seite nicht ausgewertet. Wenn die linke Seite falsch ist, hängt der Wert des Ausdrucks von der rechten Seite ab, so dass er ausgewertet werden muss.

+0

Ah ... Ich vermischte die beiden Ideen. Vielen Dank! – physicalhacker

0

Das Problem stammt aus dem for Zustand. Auf der letzten Iteration der Schleife, sowohl frnt = 4 als auch rear = 4. Die Bedingung frnt < 5 funktioniert, aber rear >= 5 ist falsch, wodurch der gesamte Ausdruck falsch wird, wodurch die Schleife unterbrochen wird. Siehe unten für die Variablen nach jeder Iteration (Beachten Sie, dass die Tabelle die Variablen nach jedem Durchlauf des Schleifenrumpfs anzeigt und die Variablen geändert wurden).

   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 

Die beiden Zähler treffen sich in der Mitte in 4, aber die Bedingung festgelegt, dass rear >= 5. Um das richtige Verhalten zu erhalten, ändern Sie die Bedingung: frnt < 5 && rear >= 4, oder deutlicher, frnt <= 4 && rear >= 4

+0

Vielen Dank! – physicalhacker

0

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

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

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

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

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

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

Alles ist in Ordnung, 4 Iterationen und das war's.

Ich denke, Sie haben das Kurzschlussprinzip missverstanden.Im Fall von & & Bediener das Kurzschluss-Prinzip funktioniert wie folgt:

Als Ergebnis eines & & B-Betriebes ist true nur im Fall, wenn beiden Operanden true dann auf Operanden A zu bewerten und die Entdeckung, dass es false ist, gibt Es ist nicht notwendig, den Wert von Operand B auszuwerten und zu überprüfen. Wenn Operand A true ist, wird Operand B immer ausgewertet. Also in Ihrem Fall auf die Prüfung, wenn die Schleife bricht der Operand A ist 4 < 5 und der Operand B ist 4 >= 5. Da der Operand A true ist, ist es zwingend erforderlich, dass der Operand B ausgewertet und überprüft wird, und dieser Fall ist kein Kurzschluss, da beide Operanden ausgewertet werden. Ein Kurzschlussfall wäre der Fall, wenn der Operand A false ist und der Operand B nicht ausgewertet wird.

+0

Vielen Dank! – physicalhacker