Betrachten Sie die folgenden zwei Bedingungen für bitweise Vergleiche in VBScript:
%Vor%Ich denke, die Ausgabe sollte sein:
%Vor%Aber die tatsächliche Ausgabe ist:
%Vor% Warten Sie eine Sekunde, Der Operator Not
soll Führe eine logische Negation für einen Ausdruck durch . Die logische Negation von true
ist false
, soweit ich weiß. Muss ich daraus schließen, dass es dieses Versprechen nicht erfüllt? Wie und warum und was geht hier vor? Was ist die Begründung, wenn überhaupt?
Der VBScript AND-Operator führt ein logisches AND-Operation, wenn beide Operanden boolesch sind (True, False) - ähnlich wie die C (style) -Sprache &&
operator.
Wenn beide Operanden numerisch sind, wird stattdessen eine bitweise UND-Operation ausgeführt - ähnlich wie die C-Sprache &
operator.
Wenn die Operanden gemischte Typen sind, wird der boolesche Wert in eine Zahl umgewandelt - Falsch = 0, Wahr = -1 (Überraschung!), gefolgt von einer bitweisen AND-Operation.
Ihr Beispiel wird folgendermaßen ausgewertet:
%Vor% Wenn Sie sich fragen, wie der VBScript NOT-Operator funktioniert, es führt eine logische Negation für einen booleschen Operanden wie den C !
-Operator und bitweises Komplement für einen numerischen Operanden durch Operand wie der C-Operator ~
.
Wenn Sie logische Operationen für Operanden erzwingen möchten, verwenden Sie die VBScript CBool-Funktion um die Operanden zu erzeugen:
%Vor% Hinweis: Wie bei den meisten VBScript-Operatoren bewirkt der Operand Null
, dass der Operator Null
zurückgibt. Null
verhält sich auf ungewöhnliche Weise, wenn es in einem If
-Konstrukt verwendet wird.
Ich fand die Antwort auf meine Frage auf Eric Lipperts Blog: Nicht logisch ist VBScript . Es stellt sich heraus, dass der Operator Not
, genau wie seine Brüder, kein boolescher Operator ist.
And
, Or
, Not
und Xor
werden unter Logische Operatoren auf MSDN abgelegt.
Aber Eric Lippert bezeichnet sie als bitweise , und das ist eine bessere Beschreibung als nur logisch wie auf MSDN, weil logisch nicht heißt wie sie arbeiten, also werden Leute wie ich davon abgehalten zu glauben, dass sie boolean Operatoren sind, was sie nicht sind. Und das ist eine große Falle.
Ich müsste meine Aussagen wie folgt umschreiben, damit sie machen können, was ich will:
%Vor% Dies druckt yes
und dann no
, wie es sollte.
Update: Während das oben genannte für diesen Fall zu funktionieren scheint, ist es definitiv nicht der richtige Weg. Das Problem besteht darin zu verstehen, wonach ich suchen möchte. Der obige Code macht es nicht klar. Ein bitweiser Vergleich und ein numerischer Vergleich für mehr als 0 im Ergebnis sind nicht äquivalent zu einer booleschen Prüfung.
Betrachten Sie den folgenden Code, der den Vorschlag von Salman A CBool
als endgültige Lösung für dieses Problem annimmt:
Tags und Links vbscript bit-manipulation boolean