Warum wird func3 in dem Programm unten nicht ausgeführt? Nach func1 muss func2 nicht für func3 ausgewertet werden, oder?
%Vor%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%Java-Funktionen werden gemäß Vorrangregeln
bewertetweil "& 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.
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.
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.
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
werfenkurze Antwort: Kurzschlussauswertung
da func1 () yelds wahr ist, muss die Auswertung nicht fortgesetzt werden, da sie immer wahr ist
Wenn Funktion 1 immer wahr zurückgibt, muss Java den Rest des Ausdrucks nicht auswerten, um zu bestimmen, dass der gesamte Ausdruck wahr ist.
Wenn alle Funktionen ausgeführt werden sollen, können Sie die Abkürzungsvarianten löschen
%Vor%Tags und Links java logical-operators