6.2. Условный оператор (IF...THEN...ELSE)

Условный оператор IF...THEN...ELSE (если...то...иначе) имеет структуру

If Условие THEN Оператор1 ELSE Оператор2;

и служит для организации процесса вычислений в зависимости от какого-либо логического условия. Под условием понимается логическое значение True (истинно) или False (ложно), представленное константой, переменной или логическим выражением, например:

IF True THEN ...; { крайний и бесполезный случай условия }

IF LogicalVar THEN ...; { условие — логическая переменная }

IF not LogicalVar THEN ...; {условие — логическое выражение}

IF x > 5 THEN ...; { условие — результат операции сравнения}

Если условие представлено значением True, то выполняется оператор (простой или составной), следующий за словом THEN. Но если условие не выполняется, т.е. представлено значением False, то будет выполняться оператор (может быть простым или составным), следующий за словом ELSE. Например:

- 95 -

| IF x>5

| THEN { ветвь при x>5 - истинно }

| BEGIN

| x:=x+5; y:=1 { некий составной оператор }

| end

| ELSE { ветвь при x>5 - ложно }

| y:=-1; { простой оператор }

В примере между ключевыми словами нет точек с запятой. Более того, их появление было бы ошибкой, что будет показано ниже. Но точка с запятой в конце всего оператора (после завершения ветви ELSE) обязательна. Она отделяет условный оператор от остальных, следующих за ним по тексту. Альтернативную ветвь ELSE можно опускать, если в ней нет необходимости. В таком «усеченном» условном операторе в случае невыполнения условия ничего не происходит, и выполняется следующий за условным оператор. Имеет «право на жизнь» условный оператор с ветвями, содержащими пустые операторы, например такой:

IF LogicFunc(x) THEN ;

Он полезен в случаях, когда условием является возвращаемое значение какой-либо логической функции, имеющей побочный эффект. Например, известны библиотеки подпрограмм (Turbo Power Toolbox), где для создания окна на экране дисплея имеются функции, собственно строящие окно и возвращающие логическое значение в зависимости от результата построения. Приведенная выше конструкция позволяет проявиться побочному эффекту, игнорируя возвращаемое значение.

Условные операторы могут быть вложенными друг в друга:

IF Условие

THEN { Условие выполняется }

if ПодУсловие { ПодУсловие выполняется }

then

BEGIN

...

end

else { ПодУсловие не выполняется }

BEGIN

...

end

ELSE { Условие не выполняется }

BEGIN

...

end;

- 96 -

Еще раз обращаем внимание на отсутствие точки с запятой между ключевыми словами до самого внешнего слова END.

При вложениях условных операторов самое главное — не запутаться в вариантах сочетаний условий (отчасти этому может помочь ступенчатая форма записи операторов). Всегда действует правило: альтернатива ELSE считается принадлежащей ближайшему условному оператору IF, не имеющему ветви ELSE. Именно это правило заложено в компилятор, и, как следствие этого, есть риск создать неправильно понимаемые условия. Например:

IF Условие1

THEN

if Условие2

then ОператорА

ELSE

ОператорБ;

По записи похоже, что ОператорБ будет выполняться только при невыполнении Условия1. Но в действительности он будет отнесен к Условию2 и выполнится лишь при выполнении Условия1 и невыполнении Условия2. Попытка закрыть вложенный условный оператор установкой «;» после ОператораА лишь ухудшит положение. Выход здесь таков: нужно представить вложенное условие как составной оператор

IF Условие1

THEN

BEGIN

if Условие2

then ОператорА

end

ELSE

ОператорБ;

и для ветви ELSE ближайшим «незакрытым» оператором IF окажется оператор с Условием1.

В условии оператора IF может стоять достаточно сложное логическое выражение. В нем придется учитывать приоритет различных логических и математических операций, а также текущую схему компиляции логических выражений в Турбо Паскале. (Подробнее об этом см. разд. 9.3 «Логические вычисления и операции отношения».)