在表达式中发生多个作时,将按预先确定的顺序计算并解析每个部分,称为 运算符优先级。
优先规则
当表达式包含来自多个类别的运算符时,会根据以下规则计算这些运算符:
算术和串联运算符具有下一节中所述的优先级顺序,并且都比比较运算符、逻辑运算符和按位运算符具有更高的优先级。
所有比较运算符都具有相等的优先级,并且其优先级都高于逻辑运算符和按位运算符,但优先级低于算术和串联运算符。
逻辑运算符和按位运算符具有下一节中所述的优先级顺序,并且其优先级都低于算术、串联和比较运算符。
优先级相等的运算符按表达式中显示的顺序从左到右计算。
优先级顺序
运算符按以下优先级顺序计算:
Await 运算符
等待
算术和串联运算符
指数 (^
)
一元身份和否定 (+
, –
)
乘法和浮点除法 (*
, /
)
整数除法 (\
)
模块化算术 (Mod
)
加法和减法 (+
, –
)
字符串串联 (&
)
算术位移位 (<<
, >>
)
比较运算符
所有比较运算符(=
、、<
>=
IsNot
Is
Like
<=
>
<>
...) TypeOf
Is
逻辑运算符和按位运算符
否定 (Not
)
连词 (And
, AndAlso
)
非独占解禁 (Or
, OrElse
)
独家解禁 (Xor
)
注释
运算符 =
只是相等比较运算符,而不是赋值运算符。
字符串串联运算符 (&
) 不是算术运算符,但优先使用算术运算符分组。
运算符Is
IsNot
是对象引用比较运算符。 它们不比较两个对象的值;它们仅检查以确定两个对象变量是否引用同一对象实例。
结合性
当优先级相等的运算符出现在表达式中(例如乘法和除法)中时,编译器会计算每个作,因为它从左到右遇到它。 下面的示例对此进行了演示。
Dim n1 As Integer = 96 / 8 / 4
Dim n2 As Integer = (96 / 8) / 4
Dim n3 As Integer = 96 / (8 / 4)
第一个表达式计算除法 96 / 8(结果为 12),然后计算除法 12 / 4,结果为 3。 由于编译器计算从左到右的运算 n1
,因此当显式指示 n2
该顺序时,求值是相同的。 两者兼n1
n2
有三个结果。 相比之下, n3
结果为 48,因为括号强制编译器先计算 8/4。
由于此行为,据说运算符在 Visual Basic 中 保持关联 。
重写优先级和关联性
可以使用括号强制对表达式的某些部分进行计算,然后再对其他部分进行计算。 这可以替代优先级顺序和左关联性。 Visual Basic 始终执行在外部括号中括起来的作。 但是,在括号内,除非在括号中使用括号,否则它将保持普通的优先级和关联性。 下面的示例对此进行了演示。
Dim a, b, c, d, e, f, g As Double
a = 8.0
b = 3.0
c = 4.0
d = 2.0
e = 1.0
f = a - b + c / d * e
' The preceding line sets f to 7.0. Because of natural operator
' precedence and associativity, it is exactly equivalent to the
' following line.
f = (a - b) + ((c / d) * e)
' The following line overrides the natural operator precedence
' and left associativity.
g = (a - (b + c)) / (d * e)
' The preceding line sets g to 0.5.