Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП лекции Раздел 4.doc
Скачиваний:
16
Добавлен:
28.09.2019
Размер:
2.56 Mб
Скачать

4.3.5. Управляющие конструкции. Условные операторы

В языках С и C++ существуют две разновидности условных операторов или опе­раторов выбора (selection statements): if-statement и switch-statement. Кроме того, есть условная операция (conditional ? :). которая по смыслу и способу функционирования очень похожа на оператор if.

Рассмотрим схему оператора if:

if (условие) { операторы } else { операторы }

Фигурные скобки в каждой ветви можно опустить, если оператор только один. Ветвь else необязательна. Условие (точнее, условное выражение) вычисляется, и в зависимости от его результата происходит разветвление. Если знамение вы­ражения равно 0 или NULL в случае указателей, то результат условно­го выражения считается false, иначе — true. В языке C++ теперь появился стандартный тип bool. Переменные этого типа могут принимать значения из множества {false, true}.

В качестве единственного оператора ветви может (снова) быть условный опе­ратор. В этом случае говорят о вложенности условных операторов. Следует про­являть осторожность при программировании сложных условий, так как легко допустить ошибку в осмыслении семантики вложенных операторов. Например, пусть задана кусочно-непрерывная функция у(х) в виде графика (рис. А.1).

Рис. АЛ. Кусочно-непрерывная функция

Чтобы задать эту функцию с помощью цепочки вложенных условных опера­торов, определим переменные double x, у; и, выделив участки оси х, где функ­ция определяется однозначно, получим:

if (х>1)

if (x>2)

if (x>3)

if (x>4) у=0;

else у=-2*х+8; else y=2: else у=2*х-2; else y=0 ;

Отступами принято показывать, какой else соответствует данному if. Одна­ко компилятор игнорирует отступы и устраняет двусмысленность, приписывая else последнему незакрытому if. Рассмотрим фрагмент программы:

if (x==2)

if (y==2) puts ("x и у равны 2"); else puts ("x не равен 2");

Здесь функция puts служит для вывода строки символов.

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

if (х==2) {

if (у==2) puts ("x и у равны 2"): } else puts ("x не равен 2"):

Другой условный оператор switch позволяет передать управление на какую-то одну из множества ветвей типа case. Алгоритм функционирования оператора можно описать в виде схемы:

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

{

case константа1: операторы;

case константа2: операторы;

default: операторы;

}

Результатом выражения должно быть значение одного из целых типов. Каж­дый case-оператор должен быть снабжен константной меткой целого типа (или сводимого к нему). Управление после вычисления выражения передается той ветви, метка которой совпадает со значением выражения. Если такой константы не нашлось, управление передается в ветвь default. Наличие этой ветви не обя­зательно. Если ее нет и нет подходящей константы, то ни одна из ветвей не по­лучит управления. Допустимым считается случай, когда два или более case-опе­ратора обозначают одну и ту же ветвь. Порядок следования ветвей произвольный, поэтому ветвь с меткой default может быть как первой, так и любой другой. Последовательность выполнения операторов в случае попадания в любую ветвь обычная, поэтому после выполнения всех операторов данной ветви управление передается в следующую ветвь, так как метки при выполнении игнорируются. Чтобы в конце ветви передать управление за пределы оператора switch, необхо­димо использовать оператор break. Другими возможными средствами выхода из switch являются операторы перехода (jump statements):

goto метка; continue; return;

Оператор return; осуществляет выход из функции, ничего не возвращая в точку вызова. Оператор return value; возвращает значение переменной value. Оператор continue; передает управление в конец самого внутреннего открытого цикла. Оператор goto метка; осуществляет переход в точку программы, которая помечена меткой (идентификатором, ссылающимся на адрес следующего выполнимого оператора).

Рассмотрим выражение: (условие) ? exprl : ехрг2;. Оно вычисляется в таком порядке. Сначала вычисляется условие. Если результат не равен нулю (условие выполнено), то вычисляется exprl, а ехрг2 игнорируется. Если условие дает ну­левой результат (false), то вычисляется ехрг2, a exprl игнорируется. Так как операция ? : требует трех аргументов, то ее называют тернарной. Она также носит название Conditional ? :. Ее удобно рассматривать как разновидность условного оператора. Однако специфика тернарной операции заключается в том, что она возвращает значение, то есть она может быть rvalue. Например:

i = х<0 ? -1 : 1; //Равносильно if (x<0) i=-1; else i=1;

Выражения exprl и ехрг2 могут, в свою очередь, быть операторами вида Conditional ? :. Поэтому можно создавать и более сложные конструкции, например:

i = х<0 ? -1 : х>0 ? 1 : 0;

Переменной i будет присвоено значение –1, 1, или 0 в зависимости от отрицательности, положительности или равенства нулю значения х.