Eric Lippertのブログで私の質問に対する答えを見つけました:論理的ではありませんVBScriptです。演算子Not
は、その兄弟のように、実際にはブール演算子ではないことがわかります。
And
、、、およびは、MSDNの論理演算子の下Or
にNot
Xor
ファイルされます。
しかし、Eric Lippertはそれらをビット単位でラベル付けします。これは、MSDNのように論理的なものよりも優れた説明です。論理的なものは実際にどのように機能しているかを示していないため、私のような人々は、彼らがブール演算子であると信じ込んでしまいます。再しないでください。そして、これは大きな罠です。
ステートメントを次のように書き直して、自分のやりたいことを実行させる必要があります。
If (1 And 3) > 0 Then WScript.Echo "yes" Else WScript.Echo "no"
If Not((1 And 3) > 0) Then WScript.Echo "yes" Else WScript.Echo "no"
これは、印刷yes
してから必要に応じて印刷しno
ます。
更新:上記はこの場合は機能するように見えますが、それは間違いなく進むべき道ではありません。問題は、私がチェックしたいことが何であるかを理解することです。上記のコードはそれを明確にしません。結果の0より大きいビット単位の比較と数値の比較は、ブールチェックと同等ではありません。
CBool
この問題の最終的な解決策としてSalmanAの提案を採用した次のコードについて考えてみます。
Option Explicit
Dim a, b
a = -3 : b = -2
If a And b Then WScript.Echo "ja" Else WScript.Echo "nein" ' bad
If (a And b) > 0 Then WScript.Echo "ja" Else WScript.Echo "nein" ' bad
If CBool(a And b) Then WScript.Echo "ja" Else WScript.Echo "nein" ' good