4

由于 VBScript(经典 ASP)中的 IF 语句中的隐式转换在处理变量或文字时不会以相同的方式进行隐式转换,我们目前遇到了问题。有人可以向我解释这种行为吗,为什么 VBScript 会这样?

这是我的意思的示例:

Const c_test = 3
Dim iId : iId = 3
Dim iTestStr : iTestStr = "3"

If iId = iTestStr Then
    Response.Write("Long variable = String variable : Equal")
Else
    Response.Write("Long variable = String variable : Not Equal")
End If

Response.Write("<br/>")

If c_test = iTestStr Then
    Response.Write("Long constant = String variable : Equal")
Else
    Response.Write("Long constant = String variable : Not Equal")
End If

Response.Write("<br/>")

If c_test = iId Then
    Response.Write("Long constant = Long variable : Equal")
Else
    Response.Write("Long constant = Long variable : Not Equal")
End If

Response.Write("<br/>")

If iId = "3" Then
    Response.Write("Long variable = String literal : Equal")
Else
    Response.Write("Long variable = String literal : Not Equal")
End If

Response.Write("<br/>")

If c_test = "3" Then
    Response.Write("Long constant = String literal : Equal")
Else
    Response.Write("Long constant = String literal : Not Equal")
End If

输出:

长变量 = 字符串变量:不等于

长常量 = 字符串变量:不等于

长常量 = 长变量:等于

长变量 = 字符串文字:等于

长常量 = 字符串文字:等于

这很令人困惑o_O

4

2 回答 2

4

这是一种记录的行为和一种未记录的行为的结果。


记录在案的行为是,在比较中,数字始终小于字符串。这在比较运算符的文档中有所提及。解释页面底部附近的表格:

如果一个表达式是数字而另一个是字符串,数字表达式小于字符串表达式。


未记录的行为是涉及文字的比较与涉及变量的比较处理方式不同。有关更多详细信息,请参阅此博客条目。总结一下重要结论:

VB6/VBScript 中的相关比较规则如下:

  • 硬字符串~硬数字:将字符串转换为数字,比较数字
  • 硬字符串~软数字:将数字转换为字符串,比较字符串
  • 软字符串~硬数字:将字符串转换为数字,比较数字
  • 软字符串~软数:任意字符串大于任意数

记录的行为解释了为什么前两个比较是错误的,而未记录的行为解释了为什么最后两个比较是真的。

于 2012-12-09T06:26:24.617 回答
1

您正在(隐式)声明您的变量As Variant,因此您的If条件实际上测试了两个Variants 的相等性并确定它们不相等。

但是,在最后一种情况下,您使用的是String常量(Variant即使在没有类型的情况下声明也不能是 )和String文字。

我的猜测是,当您比较两个Variants 时,VB 首先确定它们是否具有相同的类型标签,如果没有,则解析为False.

于 2010-03-01T14:44:40.883 回答