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, являющееся оператором, всегда заканчива- ется точкой с запятой.