以下のドキュメントによると、VBScriptのTrueは -1
と等価です。
また、Falseは 0
と等価です。
一方、C言語ではstdbool.hの中で、trueを1と等価に、falseを0と等価にしています。
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#else /* __cplusplus */
また、JavaScriptではtrueを整数型にキャストすると、1になります。
Number(true)
// => 1
さらに、Pythonではbool型はint型のサブタイプであり、Trueは1と等価です。
True == 1
# => True
なぜ、C言語やJavaScriptやPythonのtrueは1と等価だったり、キャストすると1になるのに、VBScriptのTrueは-1と等価なのでしょうか?
答え
VBScriptにはビット演算と論理演算を同じ演算子で行うため。
C言語やRubyやPythonやJavaScriptなどの主要な言語では、ビット演算と論理演算が明確に区別されています。
/* C言語 */
a = b & c /* ビット演算 */
a = b && c /* 論理演算 */
# Ruby
a = b & c # ビット演算
a = b && c # 論理演算
# Python
a = b & c # ビット演算
a = b and c # 論理演算
/* JavaScript */
a = b & c /* ビット演算 */
a = b && c /* 論理演算 */
一方VBScriptでは、これら2つの演算はどちらも同じ演算子によってなされます。
' VBScript
a = b And c ' ビット演算
a = b And c ' 論理演算
参考: And演算子
ここでは、And演算子のみを例に出しましたが、Or演算子やNot演算子についても同様です。
では、他の言語では別々の演算子によって提供されている機能を、VBScriptはどうやって1つの演算子のみで提供しているのでしょうか?
VBScriptにはビット演算子しかなく、TrueとFalseをいい感じに整数型にマッピングすることによって論理演算子っぽく見せているのが真相です。
そのためには、Trueをすべてのbitが1の整数に、Falseをすべてのbitが0の整数にマッピングすることが必要であり、またそうする以外にこの要件を満たすマッピング方法はありません(必要十分条件)。
さて、このように符号化されたTrueとFalseを数値型の表現に復号するとどうなるのでしょうか?
Falseが0になることは自明ですが、Trueはどうなるのでしょうか?
VBScriptの整数型は符号付き16bit整数で、負数の表現方法には2の補数形式が使われています。
そのため、すべてのbitが1の整数は-1という数値を表すことになります。
このような理由によってVBScriptのTrueは-1と等価になります。他の言語にはない珍しい仕様ですので、やや注意が必要です。
例えば、C言語のテクニックにエラー時は負数を返すというものがありますが、同様のことをVBScriptでやると罠にはまる危険性があります。