3.2. IF - ELSE
Оператор IF - ELSE используется при необходимости сделать выбор. Формально синтаксис имеет вид
IF (выражение) оператор-1 ELSE оператор-2,
где часть ELSE является необязательной. Сначала вычисляется выражение; если оно "истинно" /т.е. значение выражения отлично от нуля/, то выполняется оператор-1. Если оно ложно /значение выражения равно нулю/, и если есть часть с ELSE, то вместо оператора-1 выполняется оператор-2.
Так как IF просто проверяет численное значение выражения, то возможно некоторое сокращение записи. Самой очевидной возможностью является запись
IF (выражение)вместо
IF (выражение !=0)
Иногда такая запись является ясной и естественной, но временами она становится загадочной.
То, что часть ELSE в конструкции IF - ELSE является необязательной, приводит к двусмысленности в случае, когда ELSE опускается во вложенной последовательности операторов IF. Эта неоднозначность разрешается обычным образом -- ELSE связывается с ближайшим предыдущим IF, не содержащим ELSE. Например, в
IF ( N > 0 ) IF( A > B ) Z = A; ELSE Z = B;
конструкция ELSE относится к внутреннему IF, как мы и показали, сдвинув ELSE под соответствующий IF. Если это не то, что вы хотите, то для получения нужного соответствия необходимо использовать фигурные скобки:
IF (N > 0) { IF (A > B) Z = A; } ELSE Z = B;
Tакая двусмысленность особенно пагубна в ситуациях типа
IF (N > 0) FOR (I = 0; I < N; I++) IF (S[I] > 0) { PRINTF("..."); RETURN(I); } ELSE /* WRONG */ PRINTF("ERROR - N IS ZERO\N");
Запись ELSE под IF ясно показывает, чего вы хотите, но компилятор не получит соответствующего указания и свяжет ELSE с внутренним IF. Ошибки такого рода очень трудно обнаруживаются.
Между прочим, обратите внимание, что в
IF (A > B) Z = A; ELSE Z = B;
после Z=A стоит точка с запятой. Дело в том, что согласно грамматическим правилам за IF должен следовать оператор, а выражение типа Z=A, являющееся оператором, всегда заканчивается точкой с запятой.
ПРЕДЫДУЩАЯ ЧАСТЬ 3.1. Операторы и блоки |
СОДЕРЖАНИЕ | СЛЕДУЮЩАЯ ЧАСТЬ 3.3. ELSE - IF |