Порядок применения операторов в Visual Basic
При выполнении нескольких операций в выражении каждая часть вычисляется и разрешается в предопределенном порядке, называемом приоритетом оператора.
Правила приоритета
Если выражения содержат операторы из нескольких категорий, они оцениваются в соответствии со следующими правилами:
Операторы арифметики и объединения имеют порядок приоритета, описанного в следующем разделе, и все имеют больше приоритета, чем сравнение, логические и битовые операторы.
Все операторы сравнения имеют равный приоритет, и все имеют больший приоритет, чем логические и битовые операторы, но более низкий приоритет, чем арифметические и сцепления операторов.
Логические и битовые операторы имеют порядок приоритета, описанного в следующем разделе, и все имеют более низкий приоритет, чем арифметические, сцепления и операторы сравнения.
Операторы с равным приоритетом оцениваются слева направо в том порядке, в котором они отображаются в выражении.
Порядок приоритета
Операторы оцениваются в следующем порядке приоритета:
Оператор Await
Await
Арифметические и объединения операторов
Экспонентация (^
)
Унарное удостоверение и отрицание (+
, –
)
Умножение и деление с плавающей запятой (*
, /
)
Целочисленный деление (\
)
Модульный арифметический (Mod
)
Добавление и вычитание (+
, –
)
Объединение строк (&
)
Арифметический битовый сдвиг (<<
, >>
)
Операторы сравнения
Все операторы сравнения (=
, <
>=
>
Is
<>
<=
, Like
IsNot
TypeOf
... )Is
Логические и побитовые операторы
Отрицание (Not
)
Сочетание (And
, AndAlso
)
Инклюзивная дисъюнкционация (Or
, OrElse
)
Эксклюзивная дисъюнкция (Xor
)
Комментарии
Оператор =
является только оператором сравнения равенства, а не оператором назначения.
Оператор объединения строк (&
) не является арифметическим оператором, но в приоритете он сгруппирован с арифметическими операторами.
Операторы Is
— IsNot
это операторы сравнения ссылок на объекты. Они не сравнивают значения двух объектов; они проверка только для определения того, относятся ли две переменные объекта к одному экземпляру объекта.
Ассоциативность
Если операторы равного приоритета отображаются вместе в выражении, например умножение и деление, компилятор вычисляет каждую операцию по мере того, как она обнаруживает ее слева направо. Это показано в следующем примере.
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, что приводит к трем. Так как компилятор вычисляет операции n1
слева направо, оценка совпадает, если этот порядок явно указан для n2
. Оба n1
и n2
имеют результат трех. В отличие от этого, 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.
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.