Was ist los mit der Kurzschlusslogik in diesem Java-Code?

8

Warum wird func3 in dem Programm unten nicht ausgeführt? Nach func1 muss func2 nicht für func3 ausgewertet werden, oder?

%Vor%     
DragonBorn 12.05.2009, 13:18
quelle

9 Antworten

25

Sie verwenden einen Kurzschluss oder. Wenn das erste Argument wahr ist, ist der gesamte Ausdruck wahr.

Es kann hilfreich sein, wenn ich die impliziten Klammern hinzufüge, die der Compiler verwendet

Bearbeiten : Wie Chris Jester-Young bemerkte, liegt das daran, dass logische Operatoren von links nach rechts assoziieren müssen:

%Vor%

Nachdem func1 zurückkommt, wird dies:

%Vor%

Nach Auswertung des Kurzschlusses oder, wird es:

%Vor%     
Powerlord 12.05.2009, 13:21
quelle
5

Java-Funktionen werden gemäß Vorrangregeln

bewertet

weil "& amp; & amp;" eine höhere Priorität als "||" hat, wird es zuerst ausgewertet, weil Sie keine Klammern hatten, um die explizite Priorität festzulegen

so du Ausdruck von

%Vor%

was ist

%Vor%

wird als

geklammert %Vor%

wegen der Vorrangregeln.

Da der Compiler versteht, dass, wenn 'A == wahr', es nicht nötig ist, den Rest des Ausdrucks zu bewerten, stoppt er nach der Auswertung von A.

Wenn Sie ((A || B) && C) geklammert hätten, würde dies zu false führen.

BEARBEITEN

Ein anderer Weg, wie von anderen Plakaten erwähnt, ist die Verwendung von "|" und "& amp;" statt "||" und "& amp; & amp;" weil das den Ausdruck von der Abkürzung stoppt. Aufgrund der Vorrangregeln bleibt das Endergebnis jedoch gleich.

    
DevinB 12.05.2009 13:28
quelle
3

Java schließt boolesche Ausdrücke kurz. Das bedeutet, dass, sobald func1() ausgeführt wird und true zurückgibt, der Rest dieses booleschen Werts keine Rolle spielt, da Sie einen Operator or verwenden. Unabhängig davon, wie func2() && func3() auswertet, wird der gesamte Ausdruck als true ausgewertet. Daher kümmert sich Java nicht einmal darum, func2() oder func3() zu bewerten.

    
Marc W 12.05.2009 13:20
quelle
2
Dave Costa 12.05.2009 13:21
quelle
2

Sie verwenden die Verknüpfungsoperatoren || und & amp; Diese Operatoren führen den Rest des Ausdrucks nicht aus, wenn das Ergebnis bereits definiert ist. Für || das heißt, wenn der erste Ausdruck wahr ist und für & amp; & amp; wenn der erste Ausdruck falsch ist.

Wenn Sie alle Teile des Ausdrucks ausführen möchten, verwenden Sie | und & amp; stattdessen ist das keine Abkürzung.

    
Mnementh 12.05.2009 13:25
quelle
2

Java verwendet Lazy-Auswertung.

Da Func1 immer wahr zurückgibt, MUSS der gesamte Ausdruck wahr sein, so dass er den Rest des Ausdrucks abkürzt.

%Vor%

und

%Vor%

wird immer abkürzen.

Um die Tastenkürzelauswertung zu deaktivieren, verwenden Sie | und & amp; statt || und & amp; & amp;

Wir können dies gut nutzen:

%Vor%

Das heißt, wenn s null ist, müssen wir nicht einmal versuchen, s.quals aufzurufen, und wir werden keine NullPointerException

werfen     
Chris Cudmore 12.05.2009 13:23
quelle
1

kurze Antwort: Kurzschlussauswertung

da func1 () yelds wahr ist, muss die Auswertung nicht fortgesetzt werden, da sie immer wahr ist

    
dfa 12.05.2009 13:21
quelle
1

Wenn Funktion 1 immer wahr zurückgibt, muss Java den Rest des Ausdrucks nicht auswerten, um zu bestimmen, dass der gesamte Ausdruck wahr ist.

    
Jaime Garcia 12.05.2009 13:22
quelle
0

Wenn alle Funktionen ausgeführt werden sollen, können Sie die Abkürzungsvarianten löschen

%Vor%     
Peter Lawrey 12.05.2009 18:37
quelle

Tags und Links