在表达式中发生多个作时,将按预先确定的顺序计算并解析每个部分,称为 运算符优先级。
优先规则
当表达式包含来自多个类别的运算符时,会根据以下规则计算这些运算符:
算术和串联运算符具有下一节中所述的优先级顺序,并且都比比较运算符、逻辑运算符和按位运算符具有更高的优先级。 较高优先级意味着先计算这些运算符。
所有比较运算符都具有相等的优先级,并且其优先级都高于逻辑运算符和按位运算符,但优先级低于算术和串联运算符。
逻辑运算符和按位运算符具有下一节中所述的优先级顺序,并且其优先级都低于算术、串联和比较运算符。
优先级相等的运算符按表达式中显示的顺序从左到右计算。
优先级顺序
运算符按以下优先级顺序计算。 列出的运算符首先具有更高的优先级,并在稍后列出的运算符之前进行评估:
1. Await 运算符
等待
2. 算术运算符和串联运算符
指数 (^)
一元身份和否定 (+, –)
乘法和浮点除法 (*, /)
整数除法 (\)
模块化算术 (Mod)
加法和减法 (+, –)
字符串串联 (&)
算术位移位 (<<, >>)
3. 比较运算符
所有比较运算符(=、、<><<=>>=IsIsNotLike...) TypeOfIs
4. 逻辑运算符和按位运算符
否定 (Not)
连词 (And, AndAlso)
非独占解禁 (Or, OrElse)
独家解禁 (Xor)
注释
运算符 = 只是相等比较运算符,而不是赋值运算符。
字符串串联运算符 (&) 不是算术运算符,但优先使用算术运算符分组。
运算符IsIsNot是对象引用比较运算符。 它们不比较两个对象的值;它们仅检查以确定两个对象变量是否引用同一对象实例。
结合性
当优先级相等的运算符出现在表达式中(例如乘法和除法)中时,编译器会计算每个作,因为它从左到右遇到它。 下面的示例对此进行了演示。
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该顺序时,求值是相同的。 两者兼n1n2有三个结果。 相比之下, 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. Division and multiplication (/, *) have higher
' precedence than addition and subtraction (+, -), so c / d * e
' is evaluated first, then the addition and subtraction from left to right.
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.