算术运算符 (Visual Basic)
算术运算符用于执行很多熟悉的算术运算,涉及计算由文本、变量、其他表达式、函数和属性调用以及常数表示的数值。 另外,移位运算符也属于算术运算符,它们在操作数的单个位级别起作用,并将操作数的位模式向左或向右移。
算术运算
可以使用 + 运算符 (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) 和 / 运算符 (Visual Basic),如下面的示例所示。
Dim y As Double
y = 45 * 55.23
y = 32 / 23
求幂使用 ^ 运算符 (Visual Basic),如下面的示例所示。
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 运算符 (Visual Basic) 执行求模算法。 此运算符返回除数除被除数整数次后的余数。 如果除数和被除数都是整型,则返回值是整数。 如果除数和被除数都是浮点型,则返回值也是浮点型。 下面的示例演示这一行为。
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 |
|
Double |
Double |
< 0 |
当捕获 DivideByZeroException 异常时,可使用其成员帮助处理该异常。 例如,Message 属性保留了该异常的消息文本。 有关更多信息,请参见 Try...Catch...Finally 语句 (Visual Basic)。
移位运算
移位运算对位模式进行数学移位。 模式包含在左侧的操作数中,而右侧的操作数指定要对该模式移位的位数。 可以使用 >> 运算符 (Visual Basic) 将该模式向右移,或者使用 << 运算符 (Visual Basic) 向左移。
模式操作数的数据类型必须为 SByte、Byte、Short、UShort、Integer、UInteger、Long 或 ULong。 表示移位位数的操作数数据类型必须为 Integer,或者必须扩大到 Integer。
数学移位不是循环的,即不会将在结果的一端移出的数位从另一端重新移入。 移位操作空出的数位位置按以下方式设置:
进行数学左移位时,设置为 0
对正数进行数学右移位时,设置为 0
对负数据类型(Byte、UShort、UInteger、ULong)进行数学右移位时,设置为 0
对正数(SByte、Short、Integer 或 Long)进行数学右移位时,设置为 1
下面的示例对 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。 有关更多信息,请参见扩大转换和收缩转换 (Visual Basic)。