основыкнигиwin/dos*nixготовоелирикагостиФОРУМПОИСК
Б.В. Керниган, Д.М. Ричи -- Язык C

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