Frage

In dem PHP-Code

if(a() && b())

, wenn der erste Operand false auswertet, b() wird nicht ausgewertet werden.

Auch in

if (a() || b())

, wenn der erste Operand true auswertet, b() werden nicht ausgewertet ..

Ist dies gilt für alle Sprachen, wie Java, C #, etc?

Dies ist der Testcode ich verwenden.

<?php
function a(){
echo 'a';
return false;
}

function b(){
echo 'b';
return true;
}


if(a() && b()){
echo 'c';
}
?>
War es hilfreich?

Lösung

Das heißt Kurzauswertung .

Es ist in der Regel gilt für Sprachen, die von C (C, C ++, Java, C #), aber nicht wahr für alle Sprachen.

Zum Beispiel ist VB6 dies nicht tun, noch war es in früheren Versionen von VB.NET getan. VB8 (in Visual Studio 2005) führte die AndAlso und OrElse Betreiber für diesen Zweck.

Auch von den Kommentaren, so scheint es, dass csh Kurzauswertung von rechts nach links, um die Sache noch verwirrender.

führt

Es sollte auch darauf hingewiesen werden, dass Kurzschlussauswertung (oder fehlende) hat seine Gefahren bewusst zu sein. Wenn beispielsweise der zweite Operand eine Funktion, die keine Nebenwirkungen hat, dann kann der Code nicht genau durchführen, wie der Programmierer bestimmt.

Andere Tipps

Es ist nicht wahr für VB6.

In VB.net müssen Sie verwenden „AndAlso“ statt „Und“, wenn Sie den zweiten Ausdruck überspringen wollen zu bewerten.

  

Ist dies gilt für alle Sprachen, wie Java, C #, etc?

In C # ist dies nur gilt für die Kurzschlüsse der Betreiber || 'und ‚&&‘; wenn Sie nur ‚|‘ verwenden oder ‚&‘ wird es bewertet jedes Mal beiden Seiten.

Es heißt Kurzauswertung und die meisten Sprachen tun. In einigen Sprachen gibt es Operatoren, die dies nicht tun.

Die ursprüngliche Version von Pascal nicht, was viel Leid verursacht. Modernes Pascals, wie Delphi funktioniert auf die gleiche Art und Weise wie C et al.

Ada hat spezielle kurzgeschlossen Formen conditionals:

and then
or else

wie folgt verwendet:

if p.next /= null and then p.next.name = 'foo'
if x = 0 or else 1/x = y

In gewisser Weise ist es irgendwie schön, weil man ableiten kann, dass der Programmierer die Expression wußte benötigt kurzgeschlossen wird und dass die bedingten nicht durch Zufall zu arbeiten.

Es ist wahr, für Sprachen, die "Kinder" des C sind. PHP, Java, C ++, C #, ... oder in der gleichen "Inspiration", wie Perl

Aber es ist nicht wahr, für VB (zumindest vor .NET, die für die neue Schlüsselwort eingeführt).
(Und das ist wirklich stört das erste man mit VB arbeiten ^^)

Microsoft VBScript (häufig verwendet in Verbindung mit ‚Classic‘ ASP) hatte keine Bewertung Kurzschluss für boolesche Operatoren, sondern es bitweise Auswertung verwendet. Welches ist einer der vielen Gründe, es möglicherweise immer die schlechteste Sprache ist!

  

"Was ist hier los ist, dass VBScript   nicht logisch. VBScript ist bitweise. Alle   die so genannte logische Operatoren Arbeit   auf Zahlen, nicht auf Boolesche Werte!   Nicht, Und, Oder XOr, Eqv und Imp alle   konvertieren ihre Argumente zu vier Byte   ganze Zahlen, tun die logische Operation auf   jedes Paar von Bits in den ganzen Zahlen, und   gibt das Ergebnis. Bei True ist -1 und   Falsch ist 0 dann alles klappt,   weil -1 alle seine Bits eingeschaltet   und 0 hat alle seine Bits ausgeschaltet. Aber   wenn andere Nummern bekommen dort in all   Wetten ab“.

Genommen von diesem Blog. von Eric Lippert.

In Delphi ist es eine Compiler-Option.

Das gilt sowohl für Java als gut, aber die Betreiber |., & Etc werden beide Seiten auswerten

In Erlang, die and und or Betreiber nicht tun Kurzauswertung; Sie haben orelse und andalso Operatoren verwenden, wenn Sie Kurzschlussverhalten wollen.

In dem Standard Fortran oder Fortran, die Operanden eines Booleschen Ausdrucks können in beliebiger Reihenfolge ausgewertet werden. Unvollständige Bewertung ist erlaubt, aber die Umsetzung definiert.

Dies ermöglicht eine Optimierung von Booleschen Ausdrücken, die nicht erlaubt werden würde, wenn strenge Links-Rechts-Ordnung durchgesetzt wurde. Ausdrücke, die strenge Ordnung erfordern, müssen in separate conditionals zerlegt werden, oder abhängig von der Implementierung Annahmen gemacht werden.

Da Zersetzung verwendet wird Ordnung durchzusetzen, so folgt daraus, dass separate IF-Anweisungen können nicht immer in einen einzigen Ausdruck optimiert werden. Allerdings Auswertung Kurzschluss ist explizit mit Zersetzung, und das ist nie schlechter als Sprache, die streng von links nach rechts als innerhalb lazy evaluation zu ermöglichen.

Sprachen Weichen aus Fortran (Fortran, BASIC, VBn) abgeleitet und Sprachen, die entworfen wurden, Fortran-ähnliche Effizienz (Pascal, Ada) zunächst folgten das Fortran Beispiel ermöglicht Out-of-Order-Bewertung zu erreichen.

Die meisten Sprachen (alles, was ich je gesehen habe) verwenden Kurzschlussauswertung auf BEDINGTES Operatoren wie && und ||. Sie werden aufhören, sobald eine der Bedingungen, die Bewertung der Anforderung erfüllt hat. (Der erste falsch auf &&. Die erste echte auf ||)

Alle Binäre Operatoren wie & und |, werden verarbeitet. (Original)

Alle Bitoperatoren wie & und |, werden verarbeitet. (Edit: 5/10/17)

Dies ist eine Kurzauswertung genannt, und es ist für alle Sprachen gemeinsam, die ich je in (C, C ++, C #, Java, Smalltalk, Javascript, Lisp), mit Ausnahme VB, VB.NET und Fortran gearbeitet habe.

Es ist eigentlich eine recht nützliche Funktion. Ohne Kurzschlüsse würden Sie nicht in der Lage sein, dies zu tun:

if (a != null && a.isBlank())

Ohne Kurzschließen würden Sie, wenn Aussagen haben haben verschachtelt, da der zweite Teil einen Fehler werfen würde, wenn eine Null war.

Coldfusion wird nativ Kurz circut Auswertung tun. Ich bin sicher, dass alle CF-Entwickler geschrieben haben:

<cfif isdefined("somevariable") and somevariable eq something>
//do logic
</cfif>

MATLAB ist eine Sprache, die zwischen "Standard" logischen unterscheidet Betreiber und Kurzschlussbetreiber :

  • & (AND-Operator) und | (OR-Operator) auf Arrays in einem Element-weise Art und Weise betrieben werden kann.
  • && und || Kurzschluss sind Versionen für die der zweiten Operanden nur dann ausgewertet wird, wenn das Ergebnis nicht vollständig durch die ersten Operanden bestimmt wird. Diese können nur arbeiten auf Skalare , nicht Arrays.

Andere Antworten gegeben haben gute Beispiele für Sprachen mit und ohne Kurzschlussauswertung, damit ich sie nicht wiederholen.

Nur ein interessanter Punkt hinzuzufügen: Lisps wie Clojure haben boolean Kurzschlussauswertung, sondern zusätzlich können Sie ganz trivialer definieren jeder Operator mit Kurzschlussauswertung wie durch die Verwendung von Makros <. / p>

Beispiel eines Kurzschlusses "nand" -Betrieb in Clojure:

(defmacro nand 
  ([x] 
    `(not ~x))
  ([x & xs] 
    `(let [nand# (not ~x)]
       (if nand# 
         true               ; short circuit if we can prove the nand is true
         (nand ~@xs)))))    ; continue with the other expressions otherwise

(nand true true)
=> false

(nand false (println "Expression with a side effect!"))
=> true
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top