Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

2.2. Сокращённая форма

Сокращённая (неполная) форма if имеет следующий вид:

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

{ оператор 1;

оператор N; }

В отличие от первой формы, отсутствует else и вторая последовательность операторов. Если выражение истинно, то последовательность из N операторов выполняется. В противном случае она пропускается и выполняется следующий после if оператор.

Аналогично решается вопрос с фигурными скобками и в этом случае.

Замечание. Сравним if с аналогичным оператором языка Pascal:

  • Название оператора всегда записывается маленькими буквами.

  • Анализируемое выражение записывается обязательно в скобках.

  • Отсутствует ключевое слово then.

  • Фигурные скобки играют ту же роль, что ключевые слова begin и end.

  • Символ “;” (точка с запятой) перед else обязателен.

2.3. Особенности оператора

Определённые затруднения вызывает вложенность операторов if, когда среди операторов первой и (или) второй последовательности if есть другой, внутренний оператор if полной или сокращённой формы.

Например:

if (a>0)

if (b>0) cout<<”Yes”;

else cout<<”No”.

Для правильной интерпретации такой конструкции необходимо использовать следующее правило: else соответствует ближайшему предшествующему оператору if, ещё не имеющему else. В примере else связан с if (b>0). Поэтому вывод Yes или No в зависимости от b будет выполняться только в случае, если a>0. Если значение a неположительное, ничего выводиться не будет. Поэтому для наглядности желательно располагать ключевые слова так, чтобы это соответствовало логике программы, несмотря на то, что расположение операторов не влияет на их выполнение.

Чтобы else соответствовал внешнему оператору ветвления if (a>0), необходимо добавить фигурные скобки следующим образом:

if (a>0)

{ if (b>0) cout<<”Yes”;

}

else cout<<”No”;

И тогда имеет место полная форма внешнего оператора if и сокращённая форма внутреннего, а не наоборот, как было в первом случае.

Уровень вложенности операторов if может быть больше, чем показано выше. Часто на практике используется следующая конструкция ifelseif :

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

1я последовательность операторов;

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

2я последовательность операторов; …

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

nя последовательность операторов;

else

(n+1)я последовательность операторов;

Выражения вычисляются сверху вниз. Если будет найдено, что kе выражение истинно, то выполняется kя последовательность операторов, а остальные последовательности пропускаются. Если не найдено ни одного истинного выражения, то выполняется (n+1)я последовательность операторов при условии, что последний else присутствует, или не выполняется никаких действий, если (n+1)я последовательность вместе с последним оператором else отсутствует. Пример такой конструкции, которую иногда называют “лесенка ifelseif”, приведён в § 4.

Могут быть и другие конструкции вложенных операторов if, например:

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

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

1я последовательность операторов;

еlse 2я последовательность операторов;

else 3я последовательность операторов;

Здесь и внутренний, и внешний операторы if имеют полную форму. Во внешнем операторе в случае истинности выполняется единственный оператор if. Среди любой из трёх последовательностей операторов может быть также оператор if.

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

int a=5; /* при объявлении можно инициализировать переменную, то есть присваивать ей начальное значение */

if (a) cout<<” ненулевое значение”;

else cout<< “нулевое значение” ;

// Этот оператор if в стиле языка Pascal можно записать проще:

if (a!=0) // операция сравнения “не равно”

cout<<” ненулевое значение”;

else cout<< “нулевое значение” ; // или

if (a = = 0) // операция сравнения “ равно”

cout<<” нулевое значение”;

else cout<< “ненулевое значение” ;

Наконец, в отличие от языка Pascal, присваивание можно записать внутри другого оператора, например, внутри if в выражении в скобках. Поэтому в языке С присваивание, являясь частью выражения, называют не оператором, а операцией.

Пусть int x=5, y=2. Сравним следующие два выражения в операторе if:

/*1*/ if (x = = y) cout<<”Yes”; else cout<<”No”;

/*2*/ if (x=y) cout<<”Yes”; else cout<<”No”;

В первом варианте значения двух переменных проверяются на равенство, и в результате будет выведено слово No. Второй вариант в стиле языка Pascal равносилен следующей последовательности:

x=y; // х примет значение y, то есть 2

if (x!=0) cout<<”Yes”; else cout<<”No”; // или в стиле языка С

if (x) cout<<”Yes”; else cout<<”No”;

Поэтому в результате будет выведено слово Yes. Во втором варианте результат зависит только от начального значения y и не зависит от x.