Приоритет операторов
В выражениях может использоваться несколько операторов:
Каждый оператор в 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, что дает значениеда. Наконец вычисляется значениедаилинет(т.е.False OR True), что дает значениеда, поскольку как минимум один из операндов оператораORимеет значениеда. -
NOT (1 > 2)возвращает значениеда.1 > 2дает значениенет.NO нет(т.е.NO False) дает значениеда. -
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 сначала выполнил сложение и вычитание, а потом перешел к умножению и делению. Для этого запишем выражение следующим образом:
Сначала 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)