Приоритет операторов

В выражениях может использоваться несколько операторов:

6 + 2 - 8 / 10 * 20

Каждый оператор в 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 не являются булевым типом.

Как использовать скобки для расстановки приоритета операторов

Во избежание двусмысленности выражений, разделения его частей и, следовательно, расстановки приоритетов, можно использовать круглые скобки.

Та часть выражения, которая заключается в скобки, выполняется первой.
Скобки также выполняют особую роль при использовании функций. Скобки, являющиеся частью функции, не влияют на приоритет.

Вернемся к нашему примеру:

6 + 2 - 8 / 10 * 20

Предположим, нам нужно, чтобы PolyAnalyst сначала выполнил сложение и вычитание, а потом перешел к умножению и делению. Для этого запишем выражение следующим образом:

(6 + 2 - 8) / 10 * 20

Сначала PolyAnalyst выполнит 6 + 2 - 8 и вернет 0, затем выполнит деление и умножение: 0 / 10 * 20.

Скобки можно также использовать внутри других скобок:

6 + (2 - (8 / 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)