Арифметические операторы в Visual Basic
Арифметические операторы используются для выполнения многих знакомых арифметических операций, которые включают вычисление числовых значений, представленных литералами, переменными, другими выражениями, вызовами функций и свойств и константами. Кроме того, классифицированы арифметическими операторами являются операторы бит-shift, которые действуют на уровне отдельных бит операндов и сдвигают их битовые шаблоны влево или вправо.
Арифметические операции
Вы можете добавить два значения в выражение вместе с оператором +, или вычитать один из них с помощью оператора ( 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
,, Short
Byte
, UShort
, UInteger
Integer
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
, Integer
UShort
UInteger
Short
Byte
, , Long
) ULong
платформа .NET Framework вызывает DivideByZeroException исключение. В операциях деления с типом Decimal
Single
данных платформа .NET Framework также вызывает DivideByZeroException исключение.
В делениях с плавающей запятой, связанных с Double
типом данных, исключение не возникает, и результатом является член класса, представляющий NaNили PositiveInfinityNegativeInfinityв зависимости от дивидендов. В следующей таблице приведены различные результаты попытки деления Double
значения на ноль.
Тип данных дивидендов | Тип данных divisor | Дивидендная стоимость | Результат |
---|---|---|---|
Double |
Double |
0 | NaN (не математически определенное число) |
Double |
Double |
> 0 | PositiveInfinity |
Double |
Double |
< 0 | NegativeInfinity |
При перехвате DivideByZeroException исключения можно использовать его члены, чтобы помочь вам справиться с ним. Например, Message свойство содержит текст сообщения для исключения. Дополнительные сведения см. в разделе Оператор Try...Catch...Finally.
Операции bit-shift
Операция битового смещения выполняет арифметический сдвиг по битовой схеме. Шаблон содержится в операнде слева, а операнд справа указывает количество позиций для перемещения шаблона. Шаблон можно переместить вправо с оператором >> или влево с << помощью оператора.
Тип данных операнда шаблона должен быть 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
переменную в переменную и назначить значение Integer
переменнойDouble
, результаты ошибки компилятора, поскольку Double
переменная не может быть неявно преобразована в типInteger
.
Однако если задано Option Strict Off
, Visual Basic позволяет выполнять неявные сужающие преобразования, хотя они могут привести к неожиданной потере данных или точности. По этой причине рекомендуется использовать Option Strict On
при написании рабочего кода. Для получения дополнительной информации см. Widening and Narrowing Conversions.