4.08.2012

Research on literal constants in VBScript

VBScript: リテラル定数にまつわる調査

VBScript において、Const ステートメントで使用できるリテラル定数は以下のように分類される。

(1) 数値

 1-1 Integer
  ・16ビットの符号付き整数 (-2^15 .. 2^15)
   例:0, 32767, -32767, 01 (先頭の0は無視される), &O10 (8進数), &H7fff (16進数), &10 (8進数と同等)
   ※-32768, &H8000 はInteger型ではない。他の言語と異なるので注意。

 1-2 Long
  ・32ビットの符号付き整数 [-2^31 .. -2^15], [2^15 .. 2^31)
   例:-2147483647, –32768, 32768, 2147483647, &H7fffffff, &Hffffffff
   ※-2147483648 は Long型でない(Double型)が、&H80000000 は Long型である。奇妙な仕様。

 1-2 Double
  ・小数点付きの数値表現
  ・科学表記 (表現可能は範囲の限界は 1e+308 程度?)
  ・Long の範囲を超えた整数
   例:0., 3.14159265358979, 1e2, 1.2e-3, 2147483648, –2147483648

(2) 文字列

 2-1 String
  ・文字列を "" で囲むと文字列定数となる
   例:""(空の文字列), """" (1個のダブルクォーテーション), "Hello, World"
   ※VBScript によって定義されている定数を、Const に再利用することはできない。
     vbCrLf (Windows の改行文字: キャリッジリターン+ラインフィード),
     vbNullChar (1個のnull文字), vbNullString (長さが0の文字列、ただし""と比較しても一致しない) など

(3) 日付

 3-1 Date
  ・フォーマットに従った日付表記を ## で囲むと日付・時刻を示す定数となる
   例:#1-2#, #01-02#, #1/2#, #1 2#, #Jan-2#, #2-Jan#, "2,January" (現在の年、1月2日 0時0分0秒)
     #1-2-3#, #2003-1-2#, #2-3-Jan#, #2003-2-Jan#, (2003年1月2日 0時0分0秒)
     #4:5#, #04:05#, #4:5 AM# (1899年12月30日 4時5分0秒)
     #4:5:6#, #04:05:06#, (1899年12月30日 4時5分6秒)
     #1-2-3 4:5:6#, #4:5:6 1-2-3#, #2003-01-02 04:05:06# (2003年1月2日 4時5分6秒)
   ※日付表記において、「-」・「/」・「,」・連続したホワイトスペース文字(全角半角空白、タブ)は同じ意味となるようだ。
   ※日付フォーマットはOSのロケール設定に依存する

(4) 真偽値

 4-1 Boolean
  ・True (=-1) または False(=0)

(5) Empty値、Null値

 5-1 Empty
  ・Empty (未初期化値)

 5-2 Null
  ・Null (無効な値)

 

・検証用コード(CheckType.vbs)

If WScript.FullName <> WScript.Path & "\cscript.exe" Then
  Dim args, i, shell
  args = """" & WScript.ScriptFullName & """"
  For Each i In WScript.Arguments: args = args & " """ & i & """": Next
  Set shell = CreateObject("WScript.Shell")
  shell.Run WScript.Path & "\cscript.exe //NOLOGO " & args, 1, False
  WScript.Quit
End If


Check "0"
Check "1"
Check "0000000000000000001"
Check "32767"        ' 2^15-1
Check "32768"        ' 2^15
Check "2147483647"   ' 2^31-1
Check "2147483648"   ' 2^31
Check "-0"
Check "-1"
Check "-32767"       ' -(2^15-1)
Check "-32768"       ' -(2^15)
Check "-2147483647"  ' -(2^31-1)
Check "-2147483648"  ' -(2^31)

Check "&O000000"       ' 0
Check "&O00000000000"  ' 0
Check "&O00000000001"  ' 1
Check "&O77777"        ' 2^15-1
Check "&O17777777777"  ' 2^31-1
Check "&O177777"       ' -1
Check "&O37777777777"  ' -1
Check "&O100001"       ' -(2^15-1)
Check "&O100000"       ' -(2^15)
Check "&O20000000001"  ' -(2^31-1)
Check "&O20000000000"  ' -(2^31)

Check "&H0000"      ' 0
Check "&H00000000"  ' 0
Check "&H00000001"  ' 1
Check "&H7fff"      ' 2^15-1
Check "&H10000"     ' 2^15
Check "&H7fffffff"  ' 2^31-1
Check "&Hffff"      ' -1
Check "&Hffffffff"  ' -1
Check "&H8001"      ' -(2^15-1)
Check "&H8000"      ' -(2^15)
Check "&H80000001"  ' -(2^31-1)
Check "&H80000000"  ' -(2^31)

Check "0."
Check "3.14159265358979"
Check "1e2"
Check "1.2e-3"

Check """"""
Check """"""""""
Check """Hello, World"""

Check "#1-2#"
Check "#01-02#"
Check "#1/2#"
Check "#1 2#"
Check "#Jan-2#"
Check "#2-Jan#"
Check "#1-2-3#"
Check "#2003-1-2#"
Check "#2-3-Jan#"
Check "#2003-2-Jan#"
Check "#4:5#"
Check "#04:05#"
Check "#4:5:6#"
Check "#04:05:06#"
Check "#1-2-3 4:5:6#"
Check "#4:5:6 1-2-3#"
Check "#2003-01-02 04:05:06#"

Check "True"
Check "False"

Check "Empty"
Check "Null"

MsgBox "Click OK to exit."


Function Check(ByVal description)
  WScript.StdOut.Write description & String(24 - Len(description), " ")
  Execute "WScript.Echo VarType(" & description & ") & "": "" & TypeName(" & description & ")"
End Function

・出力結果

0                       2: Integer
1                       2: Integer
0000000000000000001     2: Integer
32767                   2: Integer
32768                   3: Long
2147483647              3: Long
2147483648              5: Double
-0                      2: Integer
-1                      2: Integer
-32767                  2: Integer
-32768                  3: Long
-2147483647             3: Long
-2147483648             5: Double
&O000000                2: Integer
&O00000000000           2: Integer
&O00000000001           2: Integer
&O77777                 2: Integer
&O17777777777           3: Long
&O177777                2: Integer
&O37777777777           2: Integer
&O100001                2: Integer
&O100000                3: Long
&O20000000001           3: Long
&O20000000000           3: Long
&H0000                  2: Integer
&H00000000              2: Integer
&H00000001              2: Integer
&H7fff                  2: Integer
&H10000                 3: Long
&H7fffffff              3: Long
&Hffff                  2: Integer
&Hffffffff              2: Integer
&H8001                  2: Integer
&H8000                  3: Long
&H80000001              3: Long
&H80000000              3: Long
0.                      5: Double
3.14159265358979        5: Double
1e2                     5: Double
1.2e-3                  5: Double
""                      8: String
""""                    8: String
"Hello, World"          8: String
#1-2#                   7: Date
#01-02#                 7: Date
#1/2#                   7: Date
#1 2#                   7: Date
#Jan-2#                 7: Date
#2-Jan#                 7: Date
#1-2-3#                 7: Date
#2003-1-2#              7: Date
#2-3-Jan#               7: Date
#2003-2-Jan#            7: Date
#4:5#                   7: Date
#04:05#                 7: Date
#4:5:6#                 7: Date
#04:05:06#              7: Date
#1-2-3 4:5:6#           7: Date
#4:5:6 1-2-3#           7: Date
#2003-01-02 04:05:06#   7: Date
True                    11: Boolean
False                   11: Boolean
Empty                   0: Empty
Null                    1: Null
参考:
VarType 関数
http://msdn.microsoft.com/ja-jp/library/cc392346.aspx

0 件のコメント:

コメントを投稿