Frage

In C # ist gewährleistet, dass Ausdrücke ausgewertet werden links nach rechts?

Zum Beispiel:

myClass = GetClass();  
if (myClass == null || myClass.Property > 0)  
    continue;

Gibt es Sprachen, die nicht erfüllen kann?

War es hilfreich?

Lösung

Sie tatsächlich beziehen sich auf eine Sprache Funktion namens „Kurzschließen logische Ausdrücke“:

Was dies bedeutet, ist dies: Wenn das Ergebnis eines logischen Ausdrucks kann nicht mehr geändert werden, zum Beispiel wenn es klar ist, dass der Ausdruck wertet auf „true“ oder „false“ egal was, wird übrige Teile des Ausdrucks nicht ausgewertet werden.

Zum Beispiel, C #, Java oder JavaScript tun, und Sie können in diesen Sprachen auf mich verlassen (um Ihre Frage zu beantworten).

In Ihrem Fall, wenn MyClass ist nicht null:

  • MyClass == null ausgewertet false
  • , da es ein „oder“ Ausdruck ist, noch der zweite Teil das Ergebnis ändern können, so wird es ausgewertet
  • myClass.Property > 0 bestimmt das Endergebnis

wenn MyClass ist null:

  • MyClass == null den Wert true
  • , da es ein „oder“ Ausdruck ist, spielt es keine Rolle, was folgt
  • nicht mehr Evaluierung durchgeführt wird, ist das Endergebnis true

Es gibt Sprachen, die logische Ausdrücke nicht kurzschluss tun. Klassische VB ist ein Beispiel, hier "myClass.Property> 0" würde ausgewertet und zu einem Fehler, wenn MyClass null war (so genannte "Nothing" in VB).

Andere Tipps

Ein Kurzschließen ist in Abschnitt 7.11 der C # 3.0-Spezifikation beschrieben:

  

Die Operation x || y entspricht   die Operation x | y, mit der Ausnahme, dass y ist   nur ausgewertet, wenn x nicht wahr ist.

Also ja, du bist in Ordnung.

Wie für andere Sprachen - ich nie sprechen mag alle Sprachen. In VB.NET, können Sie OrElse und AndAlso, die kurzgeschlossen werden, sondern schlicht Oder und und sind nicht verwenden.

Aber Vorsicht:

, wenn Sie so etwas wie

sprintf (buf, "% s% s", func1 (& var), func2 (& var));

mit Nebenwirkungen auf var, ist es nicht definiert (in C, ich bin nicht sicher, ob die Auswertungsreihenfolge in anderen Sprachen definiert ist), in welcher Reihenfolge func1 () und func2 () ausgeführt werden (es hängt davon ab, in welcher Reihenfolge (links oder rechts) werden die Argumente auf den Stapel gelegt und von dort ausgewertet.

Die Auswertung Reihenfolge hängt vom Netzbetreiber, in diesem Fall der boolean oder (||) definiert zu sein, was man gemeinhin Kurzschließen , um Konstrukte wie diese Arbeit.

Die und / oder Operatoren in Sprachen wie Ada, Visual Basic und Pascal nicht kurzschließen. Sie haben zusätzliche Betreiber bieten diese Funktionalität zu ermöglichen, wie zum Beispiel „und dann“ und „oder auch“ in Ada.

Ich bin nicht sicher, Sie sind wirklich interessiert, um oder in Kurzauswertung?

Ich bin nicht 100% sicher, aber so weit ich die Reihenfolge der Auswertung wissen immer gleich in C # (und ich nehme an die meisten, wenn nicht alle .NET-Sprachen). Kurzschlussauswertung funktioniert wie in den vorangegangenen Antworten erklärt.

in C # Sie können jedoch nicht auf Kurzschluss mit einfachen Operatoren (& anstelle von &&) wählen. Normalerweise wollen Sie kurzzuschließen, aber es kann ein Fall sein, in dem Sie alle Auswertungen ausführen wollen.

Python hat Kurzschluss or und and Operatoren.

In Java und Haskell && und || Kurzschluss als auch.

Interessante beiseite. In Haskell dies natürlich mit der Sprache kommt (Sie können Ihre eigenen Operatoren definieren, die dies tun), während in Java und C # ist es spezifische für diese beiden Operatoren

Eigentlich Kurzschluss ist ein Teil, aber Sie müssen auch wissen, ob die Sprache Garantien von links nach rechts Auswertung von denen. Zum Beispiel C (ANSI, ISO, C99) NICHT von links nach rechts garantieren Auswertung. In dem Beispielcode wäre es möglich, den Wert der Immobilie zu überprüfen, bevor für NULL Überprüfung oder beide gleichzeitig tun ... die meisten Compiler dies nicht tun, aber es gibt nichts, um es zu tun, dass und ist vollständig kompatibel mit der Spezifikation zu verhindern. Es selbst sagt Ihnen nicht einen solchen Code zu schreiben, weil dieser.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top