Справочная статья
Оператор IF
Перед действием часто нужно проверить данные: выполнять ли его вообще и какое из нескольких действий выбрать. IF принимает логическое условие и выполняет ту ветвь, для которой условие истинно. Если действие в каждой ветви одно, хватает одной строки; для нескольких действий и дополнительных проверок служит блочная запись с ELSEIF, ELSE и END IF.
Область применения и условие
Оператор работает на верхнем уровне программы и внутри подпрограмм и блоков, в консольной и графической программе. Специальный графический режим не требуется.
Условие должно иметь тип BOOLEAN; число само по себе не служит логическим условием.
Синтаксис
Блочная форма
IF <логическое выражение> THEN
⟦<операторы>⟧
⟦ELSEIF <логическое выражение> THEN
⟦<операторы>⟧⟧
⟦ELSE
⟦<операторы>⟧⟧
END IFОднострочная форма без ELSE
IF <логическое выражение> THEN <оператор>Однострочная форма с ELSE
IF <логическое выражение> THEN <оператор при TRUE> ELSE <оператор при FALSE>Части конструкции
THEN отделяет условие от действий. Логическое выражение должно вернуть BOOLEAN. В блочной форме операторы обозначают ноль или несколько инструкций выбранной ветви на отдельных строках. Можно добавить несколько ветвей ELSEIF и одну завершающую ветвь ELSE. Блочная конструкция заканчивается END IF.
В однострочной форме после THEN и, если он указан, после ELSE требуется ровно один оператор. Например, это может быть присваивание, PRINT, вызов процедуры или RETURN. Условия допустимости самого оператора сохраняются: RETURN работает в подпрограмме, EXIT FOR и CONTINUE FOR — внутри цикла FOR. Обе ветви короткой формы располагаются на одной строке, а END IF не пишется.
Выбор ветви
В однострочной форме условие вычисляется один раз: TRUE выбирает оператор после THEN, FALSE — оператор после ELSE. Невыбранная ветвь не выполняется. Если ELSE отсутствует и условие ложно, программа переходит к следующей строке.
В блочной форме условия проверяются сверху вниз. Первое значение TRUE выбирает соответствующий блок; остальные условия и блоки пропускаются. Если все условия ложны, выполняется ELSE. Без ELSE программа продолжает работу после END IF. Цепочка ELSEIF работает именно так: для значения семь первое сравнение ложно, второе истинно, поэтому выполняется вторая ветвь, а третья не рассматривается.
DIM value AS INTEGER = 7
IF value > 10 THEN
PRINT "Большое"
ELSEIF value > 5 THEN
PRINT "Среднее"
ELSE
PRINT "Малое"
END IFРезультат:
СреднееВ обеих формах каждая ветвь образует собственную область видимости. Объявленные в ней имена недоступны в другой ветви и после завершения конструкции. Внутри ветви блочного IF допускается другой IF, включая однострочный.
Правила однострочной формы
Если после THEN на той же строке находится оператор, начинается однострочный IF. Если после THEN строка заканчивается или содержит только комментарий, начинается блочный IF с обязательным END IF. Комментарий после оператора короткой формы допускается; слова ELSE и THEN внутри строки или комментария не образуют ветвь.
Перевод строки завершает однострочную конструкцию. Переносить её ELSE на следующую строку нельзя. ELSEIF, вложенный IF и операторы, открывающие блоки FOR, WHILE, DO, SELECT CASE, TRY, SUB, FUNCTION или TYPE, в короткой ветви не допускаются. Для них используйте блочный IF. Несколько операторов через двоеточие также не поддерживаются.
Форматирование сохраняет короткую форму на одной строке. Enter в конце завершённого однострочного IF переводит курсор на следующую строку без вставки END IF. В дополнениях редактора доступна отдельная заготовка однострочного IF.
Две короткие проверки подряд показывают обе ветви одной строки и отсутствие завершающего END IF:
DIM value AS INTEGER = 7
IF value > 0 THEN PRINT "Положительное" ELSE PRINT "Неположительное"
IF value < 0 THEN value = 0
PRINT valueПрограмма выводит:
Положительное
7Первый IF выбирает сообщение, второй меняет значение только при отрицательном числе. Для семи условие второго оператора ложно, поэтому присваивание не выполнилось и PRINT показал исходное значение.
Диагностика
MB1004— в однострочной форме отсутствует оператор ветви, указан лишний оператор или END IF, либо ветвь начинается с неподдерживаемого вложенного блока.MB2008— условие послеIFилиELSEIFне имеет типBOOLEAN.MB2001— имя, объявленное внутри ветви, используется после выхода из области видимости.MB1005— в конструкцииIFдопускается только один блокELSE.
Запускаемые примеры
Откройте нужный файл в IDE и запустите его. Примеры с ошибкой предназначены для проверки сообщения компилятора или выполнения.