Язык программирования Си (Ритчи, Керниган) - страница 49

, else, while или for. (Переменные могут быть объявлены внутри любого блока, об этом разговор пойдет в главе 4.) После правой закрывающей фигурной скобки в конце блока точка с запятой не ставится.

3.2 Конструкция if-else

Инструкция if-else используется для принятия решения. Формально ее синтаксисом является:

>if (выражение)

> инструкция>1

>else

> инструкция>2

причем else-часть может и отсутствовать. Сначала вычисляется выражение, и, если оно истинно (т. е. отлично от нуля), выполняется инструкция>1. Если выражение ложно (т. е. его значение равно нулю) и существует else-часть, то выполняется инструкция>2.

Так как if просто проверяет числовое значение выражения, условие иногда можно записывать в сокращенном виде. Так, запись

>if (выражение)

короче, чем

>if (выражение != 0 )

Иногда такие сокращения естественны и ясны, в других случаях, наоборот, затрудняют понимание программы.

Отсутствие else-части в одной из вложенных друг в друга if-конструкций может привести к неоднозначному толкованию записи. Эту неоднозначность разрешают тем, что else связывают с ближайшим if, у которого нет своего else. Например, в

>if (n › 0)

> if (а › b)

>  z = a;

> else

>  z = b;

else относится к внутреннему if, что мы и показали с помощью отступов. Если нам требуется иная интерпретация, необходимо должным образом расставить фигурные скобки:

>if (n › 0) {

> if (а › b)

>  z = a;

>}

>else

> z = b;

Ниже приводится пример ситуации, когда неоднозначность особенно опасна:

>if (n ›= 0)

> for (i=0; i ‹ n; i++)

>  if (s[i] › 0) {

>   printf(":");

>   return i;

>  }

>else /* НЕВЕРНО */

> printf("ошибка - отрицательное n\n");

С помощью отступов мы недвусмысленно показали, что нам нужно, однако компилятор не воспримет эту информацию и отнесет else к внутреннему if. Искать такого рода ошибки особенно тяжело. Здесь уместен следующий совет: вложенные if обрамляйте фигурными скобками. Кстати, обратите внимание на точку с запятой после z = a в

>if (а › b)

> z = а;

>else

> z = b;

Здесь она обязательна, поскольку по правилам грамматики за if должна следовать инструкция, а выражение-инструкция вроде z = a; всегда заканчивается точкой с запятой.

3.3 Конструкция else-if

Конструкция

>if (выражение)

> инструкция

>else if (выражение)

> инструкция

>else if (выражение)

> инструкция

>else if (выражение)

> инструкция

>else

> инструкция

встречается так часто, что о ней стоит поговорить особо. Приведенная последовательность инструкций if - самый общий способ описания многоступенчатого принятия решения. Выражения вычисляются по порядку; как только встречается выражение со значением "истина", выполняется соответствующая ему