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

问题描述 投票:0回答:1

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

程序通过函数

calc
中的 MSScriptControl.ScriptControl(如下面的代码块所示)访问 VBScript,此处由测试函数
tc
调用,该函数本身可以从另一个子函数或函数或直接窗格中调用通过输入
tc <expression>

当输入表达式包含类似

-a^b
的内容时,结果有时会令人惊讶。

根据运算符优先级规则,基于 VB6 行为,我期望

-a^b --> -(a^b)
但通常是
-a^b --> +(a^b)
。表达式内的空格没有明显的效果。

在下面显示的不同

Cases
中,我用“ok”标记一致的结果,用“?”标记不一致的结果。

我可以通过将每个

a^b
的情况括起来来解决这个问题,从而
(a^b)
。但是,考虑到我正在处理很长的复杂方程,这将 (i) 实现起来很乏味,并且 (ii) 会损害代码的可读性。

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

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 operator-precedence
1个回答
0
投票

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

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

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

VBScript 更喜欢取反而不是取幂,而 Visual Basic 更喜欢取幂而不是取反,这解释了为什么您会看到不同的结果。

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

© www.soinside.com 2019 - 2024. All rights reserved.