ste*_*eOw 7 vb6 vbscript operator-precedence
我正在 Win-7 32 位上以解释模式(即不是作为 .exe)运行旧的 VB6.0 程序。
该程序通过函数中的 MSScriptControl.ScriptControl(如下面的代码块所示)访问 VBScript,calc该函数在这里由测试函数调用,tc该函数本身可以从另一个子函数或函数调用,或者通过键入从直接窗格调用tc <expression>。这<expression>是一个数字数学表达式,例如2+3^2*(9-3.5)^3.
当输入表达式包含像这样的模式时,-a^b结果有时会让我感到惊讶。(这里a,b是实数的占位符 - 我不希望calc处理包含变量名的表达式。)
根据基于 VB6 行为的运算符优先级规则,我期望-a^b --> -(a^b) 但经常-a^b --> +(a^b)。正如预期的那样,表达式内的空格没有明显的效果。
在下面显示的不同结果中Cases,我用“ok”标记一致的结果,用“?”标记不一致的结果。
a^b我可以通过将每个 case 括起来来解决这个问题(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()
Run Code Online (Sandbox Code Playgroud)
值得注意的是,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
Run Code Online (Sandbox Code Playgroud)
通过括号,我们可以强制意图
'VBScript
-(5^2) '-(5 * 5) = -25
'Visual Basic
-(5^2) '-(5 * 5) = -25
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |