Инструкция 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; всегда заканчивается точкой с запятой.