# Операции

### Введение

Над значениями можно производить следующие операции:

Операция | Описание
--- | ---
+ | Числовое сложение или сцепление строк
- | Числовое вычитание или унарный минус
* | Числовое умножение
/ | Числовое деление. FAR прерывает исполнение макроса, если происходит деление на 0
& | Битовое умножение
^ | Битовое Исключающее ИЛИ (XOR)
| | Битовое сложение
<< | Битовый сдвиг влево
>> | Битовый сдвиг вправо
! | Логическое отрицание
~ | Битовое отрицание

### Детальное описание

Для разбора операций определимся с определениями:

- `Int` - целое число;
- `Dbl` - вещественное число;
- `StrInt` - строка, которая полностью преобразуется в `Int`;
- `StrDbl` - строка, которая полностью преобразуется в `Dbl`;
- `Str` - строка, которая не может быть полностью преобразована в `Int` или `Dbl` (собственно, просто набор символов).

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

Далее приведены таблицы, показывающие результаты работы операций над значениями A и B:

+ | B.Int | B.Dbl | B.StrInt | B.StrDbl | B.Str
--- | --- | --- | --- | --- | ---
A.Int | Int | Dbl | Int | Dbl | Str
A.Dbl | Dbl | Dbl | Dbl | Dbl | Str
A.StrInt | Int | Dbl | Int | Dbl | Str
A.StrDbl | Dbl | Dbl | Dbl | Dbl | Str
A.Str | Str | Str | Str | Str | Str

Здесь Str обозначает конкатенацию двух операндов.

- * / % | B.Int | B.Dbl | B.StrInt | B.StrDbl | B.Str
--- | --- | --- | --- | --- | ---
A.Int | Int | Dbl | Int | Dbl | A.Str
A.Dbl | Dbl | Dbl | Dbl | Dbl | A.Str
A.StrInt | Int | Dbl | Int | Dbl | A.Str
A.StrDbl | Dbl | Dbl | Dbl | Dbl | A.Str
A.Str | A.Str | A.Str | A.Str | A.Str | A.Str

Здесь A.Str - возвращается значение операнда A.

Для бинарных операций операнды Dbl или StrDbl предварительно преобразуется к Int.

| & ^ << >> | B.Int | B.Dbl | B.StrInt | B.StrDbl | B.Str
--- | --- | --- | --- | --- | ---
A.Int | Int | Int | Int | Int | A.Str
A.Dbl | Int | Int | Int | Int | A.Str
A.StrInt | Int | Int | Int | Int | A.Str
A.StrDbl | Int | Int | Int | Int | A.Str
A.Str | A.Str | A.Str | A.Str | A.Str | A.Str

Здесь A.Str - возвращается значение операнда A.

В операциях сравнения (==, !=, <, <=, >, >=) операнды преобразуются (там, где это возможно) и сравниваются.

В логических OR и AND операнды сравниваются как есть, строки не преобразуются в StrInt и StrDbl, а проверяются на не пустую строку.

### Приоритеты операций в выражениях

Операция | Описание
--- | ---
! ~ - | Унарные (R->L)
* / | арифметические
+ - | арифметические
<< >> | Битовый сдвиг
< <= > => | Логическое сравнение
== != | Логическое сравнение
& | Битовая (and)
^ | Битовая (xor)
| | Битовая (or)
&& | Логическая (and)
^^ | Логическая (xor)
|| | Логическая (or)