算术运算符 (Visual Basic)
算术运算符用于执行用户熟悉的许多算术运算,这些运算涉及到计算由文本、变量、其他表达式、函数、属性调用和常量表示的数值。 与算术运算符一起分类的还有移位运算符。移位运算符在操作数的各个位的级别工作,并将操作数的位模式左移或右移。
算术运算
可以使用 + 运算符将表达式中的两个值相加,或使用 - 运算符 (Visual Basic) 将两个值相减,如以下示例所示。
Dim x As Integer
x = 67 + 34
x = 32 - 12
求反也使用 - 运算符 (Visual Basic),但只使用一个操作数,如以下示例所示。
Dim x As Integer = 65
Dim y As Integer
y = -x
乘法和除法分别使用 * 运算符和 / 运算符 (Visual Basic),如以下示例所示。
Dim y As Double
y = 45 * 55.23
y = 32 / 23
乘方使用 ^ 运算符,如以下示例所示。
Dim z As Double
z = 23 ^ 3
' The preceding statement sets z to 12167 (the cube of 23).
整数除法是使用 \ 运算符 (Visual Basic) 执行的。 整数除法返回商,即,表示在不考虑任何余数的情况下,被除数可以除以除数的次数的整数。 对于此运算符,除数和被除数都必须是整数类型(SByte
、Byte
、Short
、UShort
、Integer
、UInteger
、Long
和 ULong
)。 所有其他类型必须先转换为整数类型。 以下示例演示了整数除法。
Dim k As Integer
k = 23 \ 5
' The preceding statement sets k to 4.
模算术是使用 Mod 运算符执行的。 此运算符在将被除数除以除数整数次后返回余数。 如果除数和被除数都是整数类型,则返回的值是整数。 如果除数和被除数是浮点类型,则返回的值也是浮点数。 下例演示此行为。
Dim x As Integer = 100
Dim y As Integer = 6
Dim z As Integer
z = x Mod y
' The preceding statement sets z to 4.
Dim a As Double = 100.3
Dim b As Double = 4.13
Dim c As Double
c = a Mod b
' The preceding statement sets c to 1.18.
尝试除以零
除以零的结果根据涉及的数据类型而异。 在整数除法(SByte
、Byte
、Short
、UShort
、Integer
、UInteger
、Long
、ULong
)中,.NET Framework 会引发 DivideByZeroException 异常。 在针对 Decimal
或 Single
数据类型的除法运算中,.NET Framework 也会引发 DivideByZeroException 异常。
在涉及 Double
数据类型的浮点除法中不会引发异常,结果是表示 NaN、PositiveInfinity 或 NegativeInfinity 的类成员,具体取决于被除数。 下表汇总了尝试将 Double
值除以零的各种结果。
被除数数据类型 | 除数数据类型 | 被除数值 | 结果 |
---|---|---|---|
Double |
Double |
0 | NaN(不是数学上定义的数字) |
Double |
Double |
> 0 | PositiveInfinity |
Double |
Double |
< 0 | NegativeInfinity |
在捕获到 DivideByZeroException 异常时,可以使用其成员来帮助处理此异常。 例如,Message 属性保存异常的消息文本。 有关详细信息,请参阅 Try...Catch...Finally 语句。
移位运算
移位运算对位模式执行算术移位。 模式包含在左侧的操作数中,而右侧的操作数指定要将模式偏移的位数。 可以使用 >> 运算符将模式右移,或使用 << 运算符将模式左移。
模式操作数的数据类型必须是 SByte
、Byte
、Short
、UShort
、Integer
、UInteger
、Long
或 ULong
。 移位量操作数的数据类型必须是 Integer
,或必须扩大为 Integer
。
算术移位不是循环性的,也就是说,从结果一端移出的位不会重新移入到另一端。 移位后空出的位位置设置如下:
0 表示算术左移
0 表示正数的算术右移
0 表示无符号数据类型(
Byte
、UShort
、UInteger
、ULong
)的算术右移1 表示负数(
SByte
、Short
、Integer
或Long
)的算术右移
以下示例将 Integer
值同时向左和向右偏移。
Dim lResult, rResult As Integer
Dim pattern As Integer = 12
' The low-order bits of pattern are 0000 1100.
lResult = pattern << 3
' A left shift of 3 bits produces a value of 96.
rResult = pattern >> 2
' A right shift of 2 bits produces value of 3.
算术移位永远不会生成溢出异常。
位运算
除了用作逻辑运算符之外,Not
、Or
、And
和 Xor
在对数值使用时还可执行位算术。 有关详细信息,请参阅 Visual Basic 中的逻辑运算符和位运算符中的“位运算”。
类型安全性
正常情况下,操作数的类型应该相同。 例如,如果对某个 Integer
变量进行加法运算,则应将其与另一个 Integer
变量相加,并将结果赋给类型同样为 Integer
的变量。
使用 Option Strict 语句是确保良好的类型安全代码编写实践的方法之一。 如果你设置 Option Strict On
,Visual Basic 会自动执行类型安全转换。 例如,如果你尝试将 Integer
变量与 Double
变量相加,并将值赋给 Double
变量,则该运算可正常进行,因为可将 Integer
值转换为 Double
,而不会丢失数据。 另一方面,类型不安全的转换会导致编译器错误并出现 Option Strict On
。 例如,如果尝试将 Integer
变量与 Double
变量相加,并将值赋给 Integer
变量,则会导致编译器错误,因为无法将 Double
变量隐式转换为类型 Integer
。
但是,如果你设置 Option Strict Off
,则 Visual Basic 允许进行隐式收缩转换,不过,这种转换可能会导致意外的数据丢失或精度损失。 因此,我们建议在编写生产代码时使用 Option Strict On
。 有关详细信息,请参阅 Widening and Narrowing Conversions。