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。
由于赋值运算符和相等运算符都是相同的字符 (=
),在同时使用的表达式中哪个运算符优先?
举个例子,这行代码是做什么的?
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。