VBscript 运算符优先级与 VB6 不一致

VBscript operator precedence inconsistency with VB6

提问人:steveOw 提问时间:10/19/2023 最后编辑:steveOw 更新时间:10/23/2023 访问量:134

问:

我在 Win-7 32 位上以解释模式(即不作为 .exe)运行旧的 VB6.0 程序。

该程序通过函数中的 MSScriptControl.ScriptControl(如下面的代码块所示)访问 VBScript,此处由测试函数调用,测试函数本身可以从另一个子函数或函数调用,也可以通过键入 . 下面是一个数值数学表达式,如 .calctctc <expression><expression>2+3^2*(9-3.5)^3

当输入表达式包含这样的模式时,结果有时会让我感到惊讶。(这里是实数的占位符 - 我不希望处理包含变量名称的表达式。-a^ba,bcalc

从运算符优先级规则来看,基于我期望但经常 .正如预期的那样,表达式中的空格没有明显的效果。-a^b --> -(a^b)-a^b --> +(a^b)

在下面显示的不同中,我用“ok”标记一致的结果,用“?”标记不一致的结果。Cases

我可以通过将每个案例括起来来解决这个问题。但是,鉴于我正在处理冗长复杂的方程式,这将 (i) 实现起来很乏味,并且 (ii) 会损害代码的可读性。a^b(a^b)

这种行为是否为人所知?是否有“幕后”修复(例如软件补丁或版本升级)?

vb6

Public Function calc(ipEqtn$)
    Set objScript = CreateObject("MSScriptControl.ScriptControl")
    objScript.Language = "VBScript"
    calc = objScript.eval(ipEqtn$)
End Function '... calc

Public Function tc(n)

Select Case (n)
    Case (1):  eqtn$ = "-(5 ^ 2)         ": VB6 = -(5 ^ 2)              ' --> -25,-25 ok
    Case (2):  eqtn$ = "(- 5 ^ 2)        ": VB6 = (-5 ^ 2)              ' -->  25,-25 ?
    Case (3):  eqtn$ = "(-5^2)           ": VB6 = (-5 ^ 2)              ' -->  25,-25 ?
    Case (4):  eqtn$ = "- 5 ^ 2          ": VB6 = -5 ^ 2                ' -->  25,-25 ?
    
    Case (5):  eqtn$ = "( 5^2 -5^2 )     ": VB6 = (5 ^ 2 - 5 ^ 2)       ' -->  0,0 ok
    Case (6):  eqtn$ = "( -5^2 + 5^2 )   ": VB6 = (-5 ^ 2 + 5 ^ 2)      ' --> 50,0 ?
    Case (7):  eqtn$ = "  5^2 -5^2       ": VB6 = 5 ^ 2 - 5 ^ 2         ' -->  0,0 ok
    Case (8):  eqtn$ = " -5^2 + 5^2      ": VB6 = -5 ^ 2 + 5 ^ 2        ' --> 50,0 ?
    
    Case (9):  eqtn$ = " + 5^2  -5^2     ": VB6 = 5 ^ 2 - 5 ^ 2         ' --> 0,0
    Case (10): eqtn$ = " + 5^2 + -5^2    ": VB6 = 5 ^ 2 + -5 ^ 2        ' -->50,0
    Case (11): eqtn$ = " + 5^2 + -1*5^2  ": VB6 = 5 ^ 2 + -1 * 5 ^ 2    ' --> 0,0
    
End Select
vbs = calc(eqtn$)
Debug.Print vbs, VB6
    
End Function '... tc()
VBScript VB6 运算符优先级

评论

2赞 user692942 10/19/2023
不符合 VBScript 语言参考 - 运算符优先级。获得 0 的正确方法是 。"-(5^2) + (5^2)"
3赞 Geert Bellekens 10/19/2023
你把否定和减法混为一谈。-5^2 = -5*-5 = 25
4赞 user692942 10/19/2023
Visual Basic 中的运算符优先级是不同的。在 VBScript 中,否定先于幂,而在 VB 中,先是幂,然后是否定。
4赞 MarkL 10/20/2023
正如评论中所暗示的那样,没有针对此的“修复”或更新。尽管它们有相似之处,但 VB6 是与 VBscript(以及 VB.net 和 VBA)不同的语言。这些运算符优先级差异就是这样,必须忍受。
3赞 steveOw 10/22/2023
@StayOnTarget我在 VB6 中使用 MSScriptControl.ScriptControl 和 VBScript,以便评估 VB6 字符串变量中包含的 100% 数值数学表达式。我只是检查当测试数值插入到数学参数中时,通过从另一个字符串内数学表达式扩展得出的字符串内数学表达式是否给出相同的数值结果。我不需要考虑将变量传递给 VBScript。

答:

6赞 user692942 10/20/2023 #1

值得注意的是,VBScript 和 Visual Basic 是不同的语言,一种是脚本语言,另一种是成熟的编程语言。

Visual Basic 运算符优先级在各种版本的 Visual Basic(VB、VBA、VB.Net 等)中都有很好的记录 - 请参见 Visual Basic 6.0 中的运算符优先级顺序是什么?和 Visual Basic 中的运算符优先级

当您将其与 VBScript 运算符优先级进行比较时,您会看到算术运算优先级顺序之间存在重大差异。

VBScript 支持否定而不是幂,而 Visual Basic 支持幂而不是否定,这解释了为什么您会看到不同的结果。

显而易见的解决方法是使用括号来明确您的意图(您在原始问题中提到)。

不带括号

'VBScript
-5^2 '-5 * -5 = 25
'Visual Basic
-5^2 '-5 * 5 = -25

使用括号,我们可以强制意图

'VBScript
-(5^2) '-(5 * 5) = -25
'Visual Basic
-(5^2) '-(5 * 5) = -25