API Basic Logic uk - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
NOT / AND / OR / XOR
ClassicUO • Basic
NOT інвертує умову. AND вимагає обидві умови, OR — хоча б одну, XOR — рівно одну. && є записом AND, || — записом OR. Регістр ключових слів не важливий.
Точний синтаксис
NOT (condition)
left AND right
left && right
left OR right
left || right
left XOR right
Параметри
left— Ліва умова бінарної операції. AND/OR вимагають Integer або Decimal: нуль хибний, будь-яке ненульове число істинне.right— Права умова, для AND/OR також числова. Обчислюються обидва операнди: хибна ліва частина AND чи істинна ліва частина OR не пропускає цей вираз.NOT / grouping— Для NOT беріть цілу інвертовану умову в дужки. У поєднаннях AND, OR і XOR дужки явно задають групування.
Повертає
Integer 1 (TRUE) або Integer 0 (FALSE). Це логічні, а не побітові операції: 2 AND 4 повертає 1, не бітову маску. Повернений прапорець можна перевіряти через =TRUE чи =1, =FALSE чи =0.
Поведінка
- AND, OR і XOR у цьому рушії мають один пріоритет і виконуються зліва направо: TRUE OR FALSE AND FALSE дає 0. TRUE OR (FALSE AND FALSE) дає 1. Враховуйте це правило сумісності при перенесенні коду VB.
- NOT(condition) обчислює умову й змінює її істинність. На початку порівняння NOT 1=2 означає NOT(1=2). Якщо інвертоване значення є операндом порівняння, пишіть (NOT value) у дужках.
- AND/OR відхиляють String, Array, Object і Unit. Сумісні NOT та XOR натомість перевіряють рівність числовому нулю: текст "0", порожній рядок, масиви, об’єкти й Unit вважаються ненульовими. Для них явно задавайте числову умову; CBool має власні правила перетворення.
- Кожний правий вираз виконується, зокрема виклики функцій, очікування та їхні помилки. Дужки змінюють групування, але не обов’язковість обчислення. Якщо наступний вираз дозволений лише після успішної умови, використовуйте вкладені IF.
Приклади
1. Поєднати іменовані прапорці
# ready=TRUE, blocked=FALSE. NOT(blocked) дає 1, тому canRun стає 1. ready XOR blocked істинне, бо істинний рівно один прапорець. Main повертає canRun*10+exclusive=11.
Option Explicit On
SUB Main()
VAR ready = TRUE
VAR blocked = FALSE
VAR canRun = ready AND (NOT blocked)
VAR exclusive = ready XOR blocked
RETURN canRun * 10 + exclusive
END SUB
Пояснення параметрів і виконання:
ready=TRUE, blocked=FALSE. NOT(blocked) дає 1, тому canRun стає 1. ready XOR blocked істинне, бо істинний рівно один прапорець. Main повертає canRun*10+exclusive=11.
2. Побачити обидва обов’язкові виклики
# Mark збільшує параметр counter, переданий ByRef, та повертає TRUE. Main починає з counter=0. FALSE AND Mark(counter) все одно викликає Mark; TRUE OR Mark(counter) викликає його знову. Результати умов — 0 та 1, Main повертає counter=2. Функцію Mark наведено повністю.
Option Explicit On
FUNCTION Mark(ByRef counter)
counter = counter + 1
RETURN TRUE
END FUNCTION
SUB Main()
VAR counter = 0
VAR first = FALSE AND Mark(counter)
VAR second = TRUE OR Mark(counter)
RETURN counter
END SUB
Пояснення параметрів і виконання:
Mark збільшує параметр counter, переданий ByRef, та повертає TRUE. Main починає з counter=0. FALSE AND Mark(counter) все одно викликає Mark; TRUE OR Mark(counter) викликає його знову. Результати умов — 0 та 1, Main повертає counter=2. Функцію Mark наведено повністю.
3. Явно задати групування
# legacy спочатку обчислює TRUE OR FALSE, потім AND FALSE й отримує 0. grouped спочатку обчислює FALSE AND FALSE у дужках, потім OR із TRUE й отримує 1. Main повертає legacy*10+grouped=1.
Option Explicit On
SUB Main()
VAR legacy = TRUE OR FALSE AND FALSE
VAR grouped = TRUE OR (FALSE AND FALSE)
RETURN legacy * 10 + grouped
END SUB
Пояснення параметрів і виконання:
legacy спочатку обчислює TRUE OR FALSE, потім AND FALSE й отримує 0. grouped спочатку обчислює FALSE AND FALSE у дужках, потім OR із TRUE й отримує 1. Main повертає legacy*10+grouped=1.