VBS逻辑运算符初始化空变量?

bee*_*hol 11 vbscript

考虑下面的VBS:

dim msg, myVar, myVar2

msg = "myVar = " & myVar
msg = msg & vbcrlf & "myVar = empty: " & isempty(myVar)
msg = msg & vbcrlf & "TypeName(myVar) = " & TypeName(myVar)

msgbox msg, , "BEFORE"

if not myVar then myVar2 = true

msg = "myVar = " & myVar
msg = msg & vbcrlf & "myVar = empty: " & isempty(myVar)
msg = msg & vbcrlf & "TypeName(myVar) = " & TypeName(myVar)

msgbox msg, , "AFTER"
Run Code Online (Sandbox Code Playgroud)

我希望"BEFORE"和"AFTER"的输出相同......我们所做的只是对未初始化(空)变体进行比较吗?

然而 - 似乎"if not"实际上将它初始化为(长)零!我一直在用VBS(ASP)为驴子编写代码,这对我来说是一个新的!

有几点需要注意:

  • .vbs和等效的ASP代码(在我的Win 7桌面和Server 2008 R2上)的行为相同.
  • 所有逻辑运算符 - 和/或/ not/xor都会产生这种效果
  • 比较运算符没有.

对于不警惕的人来说,这似乎是一个潜在的陷阱......任何人都能解释这种行为吗?

Kul*_*gin 6

我找不到关于这个问题的任何官方消息.在做了一些测试后,我认为这是一个错误或未记录的效果.此行为不适用于其他类似平台,如VBA和VB6.

Visual Basic for Application:

Visual Basic for Application

Visual Basic 6:

Visual Basic 6

VBScript中:

VBScript中

作为一种解决方法,按值传递表达式有效.

If Not (exp) Then
'or
If Not CBool(exp) Then
Run Code Online (Sandbox Code Playgroud)

ByRef和ByVal参数
CBool​​函数


mgr*_*639 5

如果你在中间更改该语句

if not (myVar) then myVar2 = true   'with parenthesis around myVar
Run Code Online (Sandbox Code Playgroud)

那你就不会目睹同样的行为.之前和之后现在都是一样的.

这是因为显然括号强制Not运算符仅执行逻辑测试并且将跳过Not的副作用.

https://msdn.microsoft.com/en-us/subscriptions/9cy86sfb%28v=vs.84%29.aspx上,你会发现以下有关Not

In addition, the Not operator inverts the bit values of any variable and
sets the corresponding bit in result according to the following table:
+-------------------+---------------+
| Bit in expression | Bit in result |
+-------------------+---------------+
| 0                 | 1             |
| 1                 | 0             |
+-------------------+---------------+
Run Code Online (Sandbox Code Playgroud)

例如

Msgbox Not 2   ' is -3
Msgbox Not -3  ' is 2
Run Code Online (Sandbox Code Playgroud)

如果您在内部将值存储为带符号的字节/字,则这是有意义的.

000 -4
001 -3  --> 001 inverted is 110
010 -2
011 -1
100  0
101  1
110  2  --> 110 inverted is 001
111  3
Run Code Online (Sandbox Code Playgroud)

让我们将Empty转换为Long

x = CLng(myVar)
Run Code Online (Sandbox Code Playgroud)

你会发现x的值是0.

如果你使用

if not myVar then myVar2 = true
Run Code Online (Sandbox Code Playgroud)

然后将评估不是myVar的结果(随后抛出结果值-1将被丢弃).但无论如何都要进行计算,为此必须先将Empty转换为long.


Jen*_*n R 4

https://technet.microsoft.com/en-us/library/ee198865.aspx

因此,如果您创建变量而不对其进行初始化,则该变量将采用以下默认值之一: 如果将该变量用作字符串,则初始值将为 Empty。如果将变量用作数字,则初始值为 0。

我认为,由于您正在进行布尔检查,因此您本质上是使用 myVar 作为数字,并且您的语句读起来如下:

if not 0 then myVar2 = true
'same as: if not FALSE then myVar2 = true
Run Code Online (Sandbox Code Playgroud)

所以 myVar 被初始化为 0