API Basic Arithmetic uk - 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.