SRL-операторы
SRL-операторы используются для выявления равенства, булевых вычислений и математических операций.
Значения до и после оператора называются операндами; в этом случае говорят, что операторы выполняют операции с операндами. В целом, операторы требуют наличия/принимают два значения и образуют новое значение.
Оператор + может выполнять несколько функций. Результат работы оператора зависит от типа операндов.
Когда оператор + используется с числами, он выполняет сложение. Когда оператор + используется с одной строкой и одним числом, он выполняет конкатенацию.
Некоторые операторы, например NOT, могут работать только с одним операндом.
Таблица операторов
Оператор |
Описание |
Пример(ы) |
+ |
Сложение или конкатенация. |
1 + 1 дает 2, "hello" + "world" дает "helloworld" |
- |
Вычитание |
1 - 1 дает 0. |
/ |
Деление |
1 / 1. Результат с точностью до 15 значащих цифр. Любое число, разделенное на ноль, оценивается как нулевое. |
MOD |
Остаток деления. Возвращает целое число - остаток деления первого числа на второе. |
2 MOD 2 дает 0. 2 MOD 20 дает 0. 5 MOD 2 дает 1 (поскольку 5 / 2 равно 2, остаток 1, а MOD просто возвращает целочисленное значение остатка). |
* |
Умножение |
2 * 3 дает 6. |
AND |
Булев AND. Если оба операнда истинны, то возвращается "истина". |
"Истина" и "истина" дает "истина". "Истина" и "ложь" дает "ложь". "Ложь" и "ложь" дает "ложь". |
OR |
Булев OR. Если оба операнда истинны, то возвращается "истина". |
"Истина" или "истина" дает "истина". "Истина" или "ложь" дает "истина". "Ложь" или "ложь" дает "ложь". |
NOT |
Булев NOT. Возвращает значение, обратное значению, которое стоит после оператора. |
NOT "истина" дает "ложь". NOT "ложь" дает "истина". |
XOR |
Булев, исключающий OR. Возвращает значение "истина" только в том случае, если одно из значений "истина". |
"Истина" XOR "истина" дает "ложь". "Истина" XOR "ложь" дает "истина". "ложь" XOR "ложь" дает "ложь". |
> |
Больше. Возвращает значение "истина", если первое число больше второго. |
1 > 2 возвращает "ложь". 2 > 1 возвращает "истина". |
>= |
Больше или равно. Возвращает значение "истина", если первое число больше или равно второму. |
1 >= 2 возвращает "ложь". 2 >= 2 возвращает "истина". |
< |
Меньше. Возвращает значение "истина", если первое число меньше второго. |
1 < 2 возвращает значение "истина". |
⇐ |
Меньше или равно. Возвращает значение "истина", если первое число меньше или равно второму. |
1 ⇐ 1 возвращает значение "истина". |
= |
Проверка равенства. Возвращает значение "истина", если первое значение равно второму значению. |
1=1 возвращает значение "истина". 1=2 возвращает значение "ложь". "A"="A" возвращает значение "истина". |
!= |
Проверка неравенства. Возвращает значение "истина", если первое значение не равно второму значению. |
1!=2 возвращает значение "истина". 1!=1 возвращает значение "ложь". |
Порядок вычисления операторов
В выражениях может использоваться несколько операторов.
Важно знать порядок, в котором будут вычисляться операторы, поскольку разный приоритет приводит к разным результатам.
Если вам нужно было выполнить это выражение в PolyAnalyst, результат был бы иным. Рассмотрим, почему так происходит. Каждый оператор в PolyAnalyst имеет свойство, называемое приоритетом. Некоторые операторы всегда вычисляются в первую очередь. После определения приоритета PolyAnalyst выполняет обработку слева на право. В приведенном примере операторы умножения и деления будут вычисляться в первую очередь, поскольку их приоритет выше, чем у операторов сложения и вычитания. У операторов умножения и деления приоритет одинаков, следовательно PolyAnalyst сначала вычислит 8/10 слева направо. 8/10 равно 0,25. Затем PolyAnalyst вычисляет умножение, 0.25 * 20, что дает значение 5. Следовательно, теперь вычисляется 6 + 2 - 5. Поскольку сложение и вычитание имеют приоритет одного уровня, то работая слева направо, мы сначала вычисляем 6 + 2, что дает 8. Затем вычисляем 8 - 5, что дает 3. Значение 3 (не 0) - это результат всего выражения, т.к. операторы вычисляются в соответствии с приоритетом.
При создании выражений всегда необходимо помнить о приоритете операторов для того, чтобы не получить ошибочные выражения, которые могут дать непредсказуемый результат. Ниже представлены операторы в порядке убывания приоритета. Операторы, имеющие одинаковый приоритет, выполняются слева направо.
-
1 - деление, умножение
-
2 - вычитание, сложение
-
3 - AND, OR, NOT, операторы равенства
Операция или функция с более высоким приоритетом выполняется в первую очередь. Операции и функции имеют следующий приоритет (в порядке убывания). Операторы в одной строке имеют равный приоритет, в этом случае вычисление выполняется слева направо.
-
выражения в скобках
-
функции
-
унарный + и - унарный (знак отрицательного числа)
-
* , / , % арифметические операции умножения и деления
-
сложение и вычитание
-
операторы равенства
-
NOT (логическое отрицание), AND
-
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 сначала выполнил сложение и вычитание, а потом перешел к умножению и делению. Для этого запишем выражение следующим образом: (6 + 2 - 8) / 10 * 20. Сначала PolyAnalyst выполнит 6 + 2 - 8 и вернет 0, затем выполнит деление: 0 / 10 * 20.
Скобки можно также вкладывать, например: 6 + (2 - (8 / 10)) * 20. В этом случае PolyAnalyst сначала выполнит внутреннее выражение, 8 / 10, и вернет 0.25. Затем будет выполнено выражение в скобках,2 - 0.25 (Результат - 1.75). Теперь выражение выглядит так: 6 + 1.75 * 20. При его выполнении слева направо умножение имеет более высокий приоритет по сравнению со сложением, поэтому система сначала вычислит 1.75 * 20 с результатом 35. И наконец, вычисляется 6 + 35 (Результат - 41). Данный результат отличается от полученных нами ранее результатов. Итак, необходимо точно определить, стоит ли использовать скобки в выражении, и если да, то где именно, поскольку от этого зависит возвращаемое значение. Общее правило о порядке выполнения подобного сложного выражения - от внутренней части (что в скобках) к внешней.
Скобки рекомендуется использовать для того, чтобы выражение легче воспринималось визуально. Но есть случаи, когда скобки, наоборот, могут внести неясности и значительно затруднить его восприятие, например:
-
((6 + 2 - 8)) / 10 * 20 - Здесь мы имеем двойные скобки, содержащие часть выражения, хотя вполне достаточно бы было одной открывающей и закрывающей скобок для указания приоритета.
-
((6 + 2 - 8) / 10 * 20) - Внешние скобки, заключающие в себя все выражение, совершенно не нужны и лишь усложняют его. Правильнее будет их удалить.
-
6 + 2 - (8 / 10 * 20) - В данном случае скобки не нужны, поскольку операции умножения и деления и так обладают высоким приоритетом и выполняются прежде, чем остальные. Выражение без скобок вернет то же значение, что и с ними; они лишь загромождают выражение. Некоторые могут возразить, сказав, что в данном случае скобки позволяют отделить части выражения друг от друга. Выбор остается за пользователем. Скобки оказываются особенно полезными, если пользователь не помнит правила расстановки приоритетов.
Скобки также выполняют особую роль при использовании функций. Скобки, являющиеся частью синтаксиса функции, не влияют на приоритет.