Приоритет операторов
В выражениях может использоваться несколько операторов:
Важно знать порядок, в котором будут вычисляться операторы, поскольку разный приоритет приводит к разным результатам: каждый оператор в PolyAnalyst имеет свойство, называемое приоритетом. Некоторые операторы всегда вычисляются в первую очередь.
После определения приоритета PolyAnalyst выполняет обработку слева на право:
1) В приведенном примере операторы умножения и деления будут вычисляться в первую очередь, поскольку их приоритет выше, чем у операторов сложения и вычитания.
2) У операторов умножения и деления приоритет одинаков, следовательно PolyAnalyst сначала вычислит 8 / 10
слева направо, что равно 0.80
.
3) Затем PolyAnalyst выполняет умножение, 0.80 * 20
, что дает значение 16.00
.
4) Следовательно, теперь вычисляется 6 + 2 - 16.00
. Поскольку сложение и вычитание имеют приоритет одного уровня, то работая слева направо, мы сначала вычисляем 6 + 2
, что дает 8.
5) Затем вычисляем 8 - 16.00
, что дает -8.00
.
Говоря о приоритете операторов, нужно упомянуть про общий приоритет всех элементов, которые могут присутствовать в выражении, включая функции. Операция или функция с более высоким приоритетом выполняется в первую очередь. Операторы в одной строке имеют равный приоритет, в этом случае вычисление выполняется слева направо.
Общий приоритет элементов SRL представлен ниже (в порядке убывания):
-
1 - выражения в скобках
-
2 - функции
-
3 - унарный
+
и-
унарный (знак отрицательного числа) -
4 -
*
,/
,%
(арифметические операции умножения и деления) -
5 - сложение и вычитание
-
6 - операторы равенства
-
7 - NOT (логическое отрицание), AND
-
8 - OR, XOR (исключающее OR)
Для более глубокого понимания приоритета рассмотрим несколько примеров выражений с несколькими типами операторов:
-
1 + 1 >= 2
возвращает значение "истина". Сначала вычисляется1 + 1
, что дает2
. Затем вычисляется2 >= 2
, и поскольку мы знаем, что2 = 2
дает "истина", то2 >= 2
равно "истина". -
1 > 2 OR 3 = 3
возвращает значение "истина". Сначала вычисляется1 > 2
, что дает "ложь". Затем вычисляется3 = 3
, что дает значение "истина". Наконец вычисляется значение"ложь" OR "истина"
, что дает значение "истина", поскольку как минимум один из операндов оператораOR
имеет значение "истина". -
NOT (1 > 2)
возвращает значение "истина".1 > 2
дает значение "ложь".NOT(ложь)
дает значение "истина". -
1 + 3 != 4
возвращает значение "ложь".1 + 3
дает4
.4 != 4
дает "ложь". -
2 + 3 AND 5 - 6
возвращает синтаксическую ошибку. Значение до и после оператораAND
должно быть значением "истина" или "ложь".2 + 3
дает число5
, а5 - 6
дает число-1
.5 AND -1
дает синтаксическую ошибку, поскольку числа5 и -1
не являются булевыми. PolyAnalyst не оценивает это выражение.
Как использовать скобки для расстановки приоритета операторов
Во избежание двусмысленности выражений, разделения его частей и, следовательно, расстановки приоритетов, можно использовать круглые скобки.
Та часть выражения, которая заключается в скобки, выполняется первой. |
Скобки также выполняют особую роль при использовании функций. Скобки, являющиеся частью функции, не влияют на приоритет. |
Вернемся к нашему примеру: 6 + 2 - 8 / 10 * 20
. Предположим, нам нужно, чтобы PolyAnalyst сначала выполнил сложение и вычитание, а потом перешел к умножению и делению. Для этого запишем выражение следующим образом:
Сначала PolyAnalyst выполнит 6 + 2 - 8
и вернет 0
, затем выполнит деление и умножение: 0 / 10 * 20
.
Скобки можно также использовать внутри других скобок:
В этом случае PolyAnalyst сначала выполнит внутреннее выражение 8 / 10
и вернет 0.80
. Затем будет выполнено выражение в скобках 2 - 0.80
(мы получим 1.20
). Теперь выражение выглядит так: 6 + 1.20 * 20
. При его выполнении слева направо умножение имеет более высокий приоритет по сравнению со сложением, поэтому PolyAnalyst сначала вычислит 1.20 * 20
с результатом 24.00
. И наконец, вычисляется 6 + 24.00
(мы получим 30.00
).
Скобки рекомендуется использовать для того, чтобы выражение легче воспринималось визуально. Но есть случаи, когда скобки, наоборот, могут внести неясности и значительно затруднить его восприятие, например:
-
6 + 2 - 8 / 10 * 20
– здесь мы имеем двойные скобки, содержащие часть выражения, хотя вполне достаточно бы было одной открывающей и закрывающей скобок для указания приоритета; -
((6 + 2 - 8) / 10 * 20)
– внешние скобки, заключающие в себя все выражение, совершенно не нужны и лишь усложняют его; -
6 + 2 - (8 / 10 * 20)
– в данном случае скобки не нужны, поскольку операции умножения и деления и так обладают высоким приоритетом и выполняются прежде, чем остальные (выражение без скобок вернет то же значение).