-
Notifications
You must be signed in to change notification settings - Fork 0
API Basic Arithmetic
ClassicUO • Basic
Арифметическое выражение вычисляет значение из операндов. + складывает, - вычитает или меняет знак, * умножает, / делит, MOD даёт целочисленный остаток. Сохраните выражение в переменную или верните через RETURN, чтобы использовать результат.
left + right
left - right
-right
left * right
left / right
left MOD right
(expression)
-
left— Левый числовой операнд: литерал, объявленная переменная, выражение в скобках или результат функции. У унарного минуса левого операнда нет. -
right— Правый числовой операнд. Для / это делитель; для MOD он преобразуется в Integer и после преобразования должен оставаться ненулевым. Например, делитель MOD 0.5 усекается до 0 и вызывает ошибку. -
operator / precedence— Сначала унарный -, затем * / MOD с одинаковым приоритетом слева направо, затем бинарные + - слева направо. Скобки меняют порядок. Унарный +, степень ^ и целочисленное деление обратной косой чертой этой грамматикой не поддерживаются.
Integer для целочисленных +, -, * и унарного минуса. Если участвующий числовой операнд имеет вид Decimal, эти операции дают Decimal. / всегда даёт Decimal, даже для двух целых: 5/2=2.5. MOD даёт Integer. Это вычисленное число; смысл успешности или количества предметов задаёт сам скрипт.
- MOD преобразует оба операнда в знаковые 32-битные целые по правилам движка, отбрасывая допустимые дробные части к нулю. Остаток имеет знак делимого: -17 MOD 5=-2. -2147483648 MOD -1 даёт ровно 0. Регистр слова, включая mOd, не влияет на результат.
- MOD с нулевым делителем вызывает ошибку, обрабатываемую TRY/CATCH. / использует дробное деление: ненулевой числитель при делении на ноль даёт Infinity со знаком, а 0/0 — NaN. Если нужен обычный конечный результат, проверяйте делитель заранее.
- Целочисленные +, -, *, смена знака при переполнении сохраняют младшие 32 бита; автоматического перехода к большему Integer нет. Для больших расчётов можно заранее преобразовать операнд в Decimal, если допустима приблизительность. Дробная арифметика имеет погрешность двоичного округления.
- Обычные числовые операторы сами не разбирают текст. String+String соединяет строки, String+Integer вызывает ошибку. Для числового текста явно выбирайте преобразование, например CDbl. Инфиксный MOD использует более строгий разбор целочисленного текста, чем отдельная функция BasicMod.
- Движок вычисляет операнды по порядку выражения, выбирает операцию по токену и создаёт InjectionValue. Сначала заканчивается вложенное выражение в скобках. Движения, ожидания или сети нет, если сам операнд не вызывает соответствующее API.
# plain=2+3*4 сначала выполняет умножение и даёт 14. grouped=(2+3)*4 даёт 20. Main возвращает plain*100+grouped=1420 для проверки обоих вычислений.
Option Explicit On
SUB Main()
VAR plain = 2 + 3 * 4
VAR grouped = (2 + 3) * 4
RETURN plain * 100 + grouped
END SUBРазбор параметров и выполнения:
plain=2+3*4 сначала выполняет умножение и даёт 14. grouped=(2+3)4 даёт 20. Main возвращает plain100+grouped=1420 для проверки обоих вычислений.
# DescribeBatches получает total=27 и size=5. Проверка size отвергает нулевой/отрицательный размер партии. Fix(total/size) превращает 5.4 в 5 полных партий; total mOd size даёт 2 оставшихся предмета. CStr переводит числа в возвращаемый текст "5:2". Функция приведена полностью.
Option Explicit On
FUNCTION DescribeBatches(total, size)
IF size <= 0 THEN
RETURN "invalid"
END IF
VAR whole = Fix(total / size)
VAR remaining = total mOd size
RETURN CStr(whole) + ":" + CStr(remaining)
END FUNCTION
SUB Main()
RETURN DescribeBatches(27, 5)
END SUBРазбор параметров и выполнения:
DescribeBatches получает total=27 и size=5. Проверка size отвергает нулевой/отрицательный размер партии. Fix(total/size) превращает 5.4 в 5 полных партий; total mOd size даёт 2 оставшихся предмета. CStr переводит числа в возвращаемый текст "5:2". Функция приведена полностью.
# В 10 MOD 0 делитель равен нулю. Ошибка возникает до присваивания результата unusedResult. CATCH сохраняет ошибку в problem и ставит caught=TRUE. Main возвращает 1 — признак обработки ошибки в примере, а не результат неудачного MOD.
Option Explicit On
SUB Main()
VAR caught = FALSE
TRY
VAR unusedResult = 10 MOD 0
CATCH problem
caught = TRUE
END TRY
RETURN caught
END SUBРазбор параметров и выполнения:
В 10 MOD 0 делитель равен нулю. Ошибка возникает до присваивания результата unusedResult. CATCH сохраняет ошибку в problem и ставит caught=TRUE. Main возвращает 1 — признак обработки ошибки в примере, а не результат неудачного MOD.
ClassicUO - Bad Newbie & Basic IDE Edition