API Basic Arithmetic - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

+, -, *, /, MOD

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.

Примеры

1. Приоритет и скобки

# 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 для проверки обоих вычислений.

2. Полные партии и остаток предметов

# 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". Функция приведена полностью.

3. Обработать неверный делитель

# В 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.


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic