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

IF / ELSEIF / ELSE / END IF

ClassicUO • Basic

IF выбирает не более одной ветки. Сначала проверяется IF, затем условия ELSEIF до первого истинного результата; если ни одно не подошло, выполняется ELSE при его наличии. Затем выполнение обычно продолжается после END IF.

Точный синтаксис

IF condition THEN
    statements
END IF
IF condition THEN
    statements
ELSEIF elseifCondition THEN
    statements
ELSE
    statements
END IF

Параметры

  • condition — condition: выражение, однократно проверяемое при входе. Числовой ноль ложен, ненулевые числа истинны. Предпочитайте явные сравнения или логические результаты API.
  • elseifCondition — elseifCondition: дополнительное необязательное условие; проверяется только после ложного результата всех предыдущих условий. ELSEIF пишется одним словом.
  • statements / ELSE — statements / ELSE: инструкции на следующих строках. ELSE необязателен, не имеет условия и допускается один раз, последним. THEN и END IF обязательны; используйте многострочный блок.

Возвращает

Нет значения (Unit). IF — инструкция управления, а не функция. Значение может вернуть условие или RETURN внутри выбранной ветки. Логические 1/0 можно сравнивать с TRUE/FALSE; IF count принимает любое ненулевое количество, а IF count=TRUE соответствует только 1.

Поведение

  • Компилятор создаёт условные переходы и переходы к выходу. Ложная ветка переходит к следующему условию или ELSE; выбранная пропускает остальные альтернативы. У вложенного IF свой ELSE. RETURN выходит из процедуры с выполнением окружающего FINALLY.
  • Для совместимости IF сравнивает значение с числовым нулём, а не преобразует все виды через CBool. Текст "0", пустой текст, массив, объект и Unit не равны числовому нулю и выбирают истинную ветку. Текст преобразуйте явно либо сравнивайте нужное свойство. AndAlso/OrElse требуют числовые операнды.
  • Объявления в пропущенной ветке не создают переменные при выполнении. Общий результат объявляйте и инициализируйте до IF. Option Explicit проверяет имена, но не доказывает присваивание на каждом пути. Несколько ELSE отклоняются с SC015 до запуска, в том числе без Option Explicit.

Примеры

1. Четыре варианта значения

# Classify(value) по очереди проверяет <0, =0 и <10, затем использует ELSE. Аргументы -2, 0, 7, 20 возвращают negative, zero, small, large. Main соединяет их в "negative:zero:small:large". За вызов функции выполняется только один RETURN.
Option Explicit On
FUNCTION Classify(value)
    IF value < 0 THEN
        RETURN "negative"
    ELSEIF value = 0 THEN
        RETURN "zero"
    ELSEIF value < 10 THEN
        RETURN "small"
    ELSE
        RETURN "large"
    END IF
END FUNCTION
SUB Main()
    RETURN Classify(-2) + ":" + Classify(0) + ":" + Classify(7) + ":" + Classify(20)
END SUB

Разбор параметров и выполнения:

Classify(value) по очереди проверяет <0, =0 и <10, затем использует ELSE. Аргументы -2, 0, 7, 20 возвращают negative, zero, small, large. Main соединяет их в "negative:zero:small:large". За вызов функции выполняется только один RETURN.

2. Вложенные решения

# Action(enabled, amount) сначала проверяет enabled. Если истина, amount>0 выбирает work, иначе idle. Внешний ELSE возвращает disabled. Main вызывает (TRUE,5), (TRUE,0), (FALSE,5) и возвращает "work:idle:disabled". Каждый END IF закрывает свой блок.
Option Explicit On
FUNCTION Action(enabled, amount)
    IF enabled THEN
        IF amount > 0 THEN
            RETURN "work"
        ELSE
            RETURN "idle"
        END IF
    ELSE
        RETURN "disabled"
    END IF
END FUNCTION
SUB Main()
    RETURN Action(TRUE, 5) + ":" + Action(TRUE, 0) + ":" + Action(FALSE, 5)
END SUB

Разбор параметров и выполнения:

Action(enabled, amount) сначала проверяет enabled. Если истина, amount>0 выбирает work, иначе idle. Внешний ELSE возвращает disabled. Main вызывает (TRUE,5), (TRUE,0), (FALSE,5) и возвращает "work:idle:disabled". Каждый END IF закрывает свой блок.

3. Порядок проверки условий

# Check(calls,value) увеличивает calls через ByRef и возвращает value. Первое условие ложно, второе истинно; третье условие и ELSE пропускаются. result равен 7, calls равен 2. Main возвращает calls*10+result=27. Все функции и начальные значения приведены целиком.
Option Explicit On
FUNCTION Check(ByRef calls, ByVal value)
    calls += 1
    RETURN value
END FUNCTION
SUB Main()
    VAR calls = 0
    VAR result = 0
    IF Check(calls, FALSE) THEN
        result = 5
    ELSEIF Check(calls, TRUE) THEN
        result = 7
    ELSEIF Check(calls, TRUE) THEN
        result = 9
    ELSE
        result = 8
    END IF
    RETURN calls * 10 + result
END SUB

Разбор параметров и выполнения:

Check(calls,value) увеличивает calls через ByRef и возвращает value. Первое условие ложно, второе истинно; третье условие и ELSE пропускаются. result равен 7, calls равен 2. Main возвращает calls*10+result=27. Все функции и начальные значения приведены целиком.


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

Basic