netlib.narod.ru | < Назад | Оглавление | Далее > |
Инструкция if-else используется для принятия решений. Формально ее синтакстис имеет следующий вид:
if (выражение) инструкция1 else инструкция2
причем часть else может отсутствовать. Сначала вычисляется выражение, и, если оно истинно (т.е. отлично от нуля), выполняется инструкция1. Если выражение ложно (т.е. его значение равно нулю) и существует часть else, то выполняется инструкция2.
Так как инструкция if просто проверяет числовое значение выражения, условие иногда можно записывать в сокращенном виде. Так, запись
if (выражение)
короче, чем
if (выражение != 0)
Иногда такие сокращения естественны и ясны, в других случаях, наоборот, затрудняют понимание программы.
Отсутствие части else в одной из вложенных друг в друга конструкций if-else может привести к неоднозначному толкованию записи. Компилятор решает эту неоднозначность связывая else с ближайшей инструкцией if у которой нет своего else. Например, в
if (n > 0) if (a > b) z = a; else z = b;
else относится к внутреннему if, что мы и показали с помощью отступов. Если нам требуется иная интерпретация, необходимо должным образом расставить фигурные скобки:
if (n > 0) { if (a > 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 (a > b) z = a; else z = b;
Здесь она обязательна, поскольку по правилам грамматики за if должна следовать инструкция, а чтобы выражение, вроде z = a рассматривалось как инструкция, оно должно заканчиваться точкой с запятой.
netlib.narod.ru | < Назад | Оглавление | Далее > |