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) 执行的。 整数除法返回商,即,表示在不考虑任何余数的情况下,被除数可以除以除数的次数的整数。 除数和被除数都必须是此运算符的整数类型(SByteByteShortUShortIntegerUIntegerLongULong)。 所有其他类型必须首先转换为整型。 以下示例演示整数除法。

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.

尝试除以零

除以零会产生不同的结果,具体取决于所涉及的数据类型。 在整型除法(SByteByteShortUShortIntegerUIntegerLongULong)中,.NET Framework 引发 DivideByZeroException 异常。 在 .NET Framework 中,对 DecimalSingle 数据类型执行除法运算时,也会引发 DivideByZeroException 异常。

在涉及 Double 数据类型的浮点除法中不会引发异常,结果是表示 NaNPositiveInfinityNegativeInfinity 的类成员,具体取决于被除数。 下表汇总了尝试将一个Double值除以零时的结果。

股息数据类型 除数数据类型 股息值 结果
Double Double 0 NaN (不是数学定义的数字)
Double Double > 0 PositiveInfinity
Double Double < 0 NegativeInfinity

捕获 DivideByZeroException 异常时,可以使用其成员来帮助处理异常。 例如,该 Message 属性保存异常的消息文本。 有关详细信息,请参阅 Try...Catch...Finally 语句

移位运算

移位运算对位模式执行算术移位。 该模式包含在左侧的操作数中,而右侧的操作数指定模式需要移动的位置数量。 可以使用>>运算符向右移动模式,或使用<<运算符向左移动模式。

模式操作数的数据类型必须是SByteByteShortUShortIntegerUIntegerLongULong。 移位量作数的数据类型必须是 Integer 或必须扩大为 Integer

算术移位不是循环性的,也就是说,从结果一端移出的位不会重新移入到另一端。 移位后空出的位位置设置如下:

  • 0 表示算术左移

  • 0 表示对正数进行算术右移

  • 0 表示无符号数据类型(ByteUShortUIntegerULong)的算术右移

  • 1 表示负数(SByteShortIntegerLong)的算术右移

以下示例同时向左和向右移动一个 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.

算术移位永远不会生成溢出异常。

按位运算

除了作为逻辑运算符,NotOrAndXor 在对数值进行运算时也执行按位算术。 有关详细信息,请参阅 Visual Basic 中的逻辑运算符和按位运算符中的“按位运算”。

类型安全性

操作数通常应为同一类型。 例如,如果要添加变量 Integer ,则应将其添加到另一个 Integer 变量,并且还应将结果分配给类型类型的 Integer 变量。

确保良好类型安全编码实践的一种方法是使用Option Strict Statement。 如果你设置 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 。 有关详细信息,请参阅 “扩大和缩小转换”。

另请参阅