VBScript 中赋值运算符和相等运算符的计算顺序是什么?

What is the order of evaluation of the assignment and equality operators in VBScript?

由于赋值运算符和相等运算符都是相同的字符 (=),在同时使用的表达式中哪个运算符优先?

举个例子,这行代码是做什么的?

MyThing = Session("WHATEVER") = "A"

我正在查看一些遗留代码,有很多表达式都是这样的。在我熟悉的语言中,这将是一项双重任务。但是,无论在何处使用这些表达式,都假定第一个运算符左侧的变量为布尔值。

If (MyThing) 
    doStuff() 
EndIf

所以是哪个? MyThing 等于 "A" 还是布尔值?

MyThing 是一个布尔值,具体来说如果 Session("WHATEVER") 包含 "A",则 MyThing 为真,否则为假。换句话说,第一个等号是赋值运算符,而第二个等号是相等运算符。

就个人而言,我会添加括号以使预期的操作更清楚,即

MyThing = (Session("WHATEVER") = "A")

但在大多数情况下,它会在没有括号的情况下工作。

AND也有类似的重载:它既是布尔运算符又是按位算术运算符。就像等号一样,大多数时候解释器会把它弄对,但是括号仍然是个好主意,因为 有时 -- 不总是 -- 它会做意想不到的事情,如果你尝试

If MySettings AND ThisFlag > 0 Then

-- 有时上面的内容会被解释为 (MySettings = True) AND (ThisFlag > 0) 而不是预期的 (MySettings AND ThisFlag) > 0.

语句是从左到右求值的。在您的示例中,该语句以一个变量开头,后跟 =,因此您有一个 L 值,后跟一个运算符和一些表达式。在这种情况下,= 被解释为赋值运算符。语句的其余部分成为 R 值表达式,因此所有其他 = 运算符都被解释为比较运算符。 Ergo 是 MyThing 布尔值。

VBScript 不支持多重赋值,例如 Python。