2010-09-09 8 views
5

Wenn ich folgendes haben ...Kurzschließen: OrElse kombiniert mit oder

a OrElse b 

... und a Wahre dann klar ist, b nie ausgewertet. Aber wenn ich ein Or hinzufügen, was dann?

a OrElse b Or c 

Wird/sollte c ausgewertet werden? Und was, wenn ich ein paar Klammern schreibe?

Entschuldigt, wenn dies einfach. Natürlich kann ich mich für die Antwort testen, aber ich diese Frage hier oder an anderer Stelle beantwortet nicht finden können. Viele Fragen Umgang mit Oder gegen OrElse aber nichts zu tun mit Oder mit OrElse

+0

Für eine Frage dieser Art, während es möglicherweise schneller ist, so zu fragen, kann ein einfaches Testprogramm dies aufklären und Sie können mehr in dem Prozess lernen. –

+1

@JoelEtherton: Gewiss, ich habe lange vor der Veröffentlichung dieser Frage einen einfachen Test geschrieben. Trotzdem war ich an der Expertenansicht interessiert. der Punkt der Frage ist, Experten-Antworten der Art zu sehen, die JoelCoehoorn zur Verfügung gestellt hat; nicht nur eine Antwort, sondern Hintergrund Detail plus Erklärung plus Beratung auch. – hawbsl

Antwort

3

Dies ist ein Operator Vorrang Problem. Die entsprechende Dokumentation ist hier:
http://msdn.microsoft.com/en-us/library/fw84t893.aspx?ppud=4

Die wichtige Auszüge:

  • Operatoren mit gleicher Priorität werden in der Reihenfolge links nach rechts ausgewertet, in der sie im Ausdruck erscheinen.

und

Inclusive Disjunktion (Oder OrElse)

Was lernen wir hier, dass Or und OrElse die gleiche Priorität haben und dass die Betreiber mit dem gleichen Vorrang wird von links nach rechts ausgewertet.

Deshalb würde ich erwarten, dass in Fällen, in denen a wahr ist, b nicht ausgewertet. Allerdings wird c noch sein.In Fällen, in denen a falsch sind, wird b ausgewertet und unabhängig von den b ‚s Wert der Oder wird von einem Operator c bewerten. Also, ja, c wird immer ausgewertet.

Aus praktischen Gründen sollten Sie im Allgemeinen OrElse in Ihrem Code bevorzugen, es sei denn, Sie haben einen guten Grund, Or zu verwenden. Or existiert jetzt hauptsächlich für Abwärtskompatibilität.

+0

Ich bin etwas verwirrt, wenn man bedenkt, dass 'And' laut der Dokumentation eine höhere Priorität als 'Or' /' Orelse' hat. Trotzdem habe ich in meinem Programm, wenn ich 'test (1) OrElse test (2) Und test (3) 'verwende,' 1' und 'true' als Ausgabe erhalten. Irgendeine Idee? – Anax

+0

@Anax Dies wird als solcher Test bewertet (1) OrElse resultofAnd – msarchet

+0

@Anax Nicht sicher. Ich würde '2,3,1, wahr 'davon erwarten. Ich vermute, dass es eine Art von Jitter-Optimierung ist. –

5

OrElse Kurzschlüsse zwischen den linken und rechten Seitenparameter (nur 2 Parameter). Also ich würde sagen, dass C wird immer ausgewertet werden, wie Sie dies als (A OrElse B) Or C behandeln könnten.

MSDN OrElse

-1

In meiner persönlichen Erfahrung VB neigt dazu, den Wert für alle von ihnen unabhängig davon zu erhalten, ob sie tatsächlich evaulated oder nicht.

Dies ist nur hilfreich, wenn die Bestellung für Artikel und ähnliches gilt. Ich wollte es nur notieren.

+1

Kurzschluss und orelse http://visualbasic.about.com/od/quicktips/qt/vbnetlogop.htm – diadem

3

Im Fall präsentiert, c ausgewertet. Ein kleiner Test wird Ihnen sagen:

Debug.WriteLine(test(1) OrElse test(2) Or test(3)) 

Function test(ByVal a As Integer) As Boolean 

    Debug.WriteLine(a) 
    Return True 

End Function 

Die obigen Beispiel Ausgänge:

 
1 
3 
True 
+0

+1 für sie zu testen. –