Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР5-С++-22 марта-2012.doc
Скачиваний:
12
Добавлен:
15.09.2019
Размер:
1.48 Mб
Скачать

1.4. Пустой оператор

Самая простая форма оператора — это пустой оператор. Он представляет собой одиночный символ точки с запятой (;).

;

Такая форма оператора в программном коде не выполняет ни­каких действий, но позволяет компилятору обходить требования синтаксиса на наличие оператора в некоторых конструкциях.

Пустой оператор используется там, где синтаксис языка требует присутствия оператора, а по смыслу программы никакие действия не должны выполняться, пустой оператор чаще всего используется в качестве тела цикла, ког­да все циклически выполняемые действия определены в его заголовке:

// Вычисляется факториал: 5?

for (int i=0, p=l;i<5; i++, p *= i);

Рекомендация: Случаи применения пустого оператора следует комментировать, чтобы любой, кто читает код, мог сразу понять, что оператор пропущен преднамеренно.

// ok: вторая точка с запятой – это лишний пустой оператор

ival = vl + v2;;

Этот фрагмент состоит из двух выражений: одно содержит оператор присвоения, а второе — пустой оператор.

Пустой оператор удобно использовать при разработке новых программ для резервирования строк программы для нереализованных операторов. В последствии в процессе отладки строки с пустыми операторами заменяются на реальные операторы.

Поскольку пустой оператор является вполне допустимым, он может распола­гаться везде, где ожидается оператор.

Предупреждение: Лишний пустой оператор не всегда безопасен. Например, случайный символ точки с запятой после условия оператора while или if мо­жет решительно изменить намерение программиста.

// катастрофа: лишняя точка с запятой превратила тело цикла

//в пустой оператор

while (iter 1= svec.end()); // тело цикла while пусто!

++iter; // инкремент не является частью цикла

Этот цикл выполняется бесконечно. Несмотря на отступ, выражение с операто­ром инкремента не является частью цикла. Тело цикла — это пустой оператор, обо­значенный символом точки с запятой непосредственно после условия.

1.5. Составной оператор (блок)

Составной оператор представляет собой последовательность операторов, заключенных в фигурные скоб­ки (оператор может быть и пустым).

Пример 5.2. Составной оператор

{

n++; // это составной оператор

summa+=n;

}

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

Пример 5.3. Блок

{

int n=0;

n++; // это блок

summa+=n;

}

Блок операторов обладает собственной обла­стью видимости. Объявленные внутри блока имена доступны только внутри данного блока и блоков, вложенных в него. Как обычно, имя видимо только с того момента, когда оно определено, и до конца блока включительно.

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

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

Внутри блока (и составного оператора) любой оператор должен оканчиваться точкой с запятой:

{ int a; char b = ' 0' ; a = (int)b; } // Это блок

{ func(z + 1.0, 22); e = 4 * x - 1; } // Составной оператор

// Составной оператор с условным переходом к его окончанию:

{ i--; if (i > k) goto MET; k++; MET:; } // Помечен пустой

// оператор

Обратите внимание, на отсутствие точки с запятой после закры­вающейся скобки }, обозначающей конец составного оператора или блока.

Предупреждение: В отличие от большинства других операторов, блок не завершают точкой с запятой.

Говоря о блоках, нужно помнить правила определения сферы действия имен и видимости объектов. Так как и блок, и составной оператор пользуются правами операторов, то разрешено их вложение друг в друга, причем на глубину вложения синтаксис не накладывает ограничений.

О вложении составных операторов и блоков удобнее говорить в связи с циклами, функциями и операторами выбора, которые мы рассмотрим в последующих лабораторных работах 6 - 8.

Если программы выполняют несколько операторов внутри if или else, то такие операторы следует сгруппировать внутри левой и правой фигурных скобок. Условные операторы C++ поддерживают составные операторы.

При нахождении корней квадратного алгебраического уравнения в разделе else логика программы требует рассчитать и вывести значения корней уравнения. Однако раздел else может со­держать только один оператор. Заключив три необходимых оператора в фигурные скобки, как показано в примере 5.4 их можно преобразовать в единый (составной) оператор. Этот оператор удовлетворяет и правилам языка, и потребностям программы.

Пример 5.4.

d = b*b – 4*a*c; //Вычисление дискриминанта d

if (d < 0.0)

printf ("Корней нет\n"); //Печать сообщения

else

{ //Начало составного оператора

x1 = ( – b + sqrt(d)) / (2.*a); //Вычисление корней.

x2 = ( – b – sqrt(d)) / (2.*a);

printf ("Корни равны x1=%6.2f x2=%6.2f\n", x1, x2);

} //Конец составного оператора

Тело цикла while или for составляет один оператор. Но в теле цикла зачастую не­обходимо выполнить несколько операторов. Заключив, необходимые операторы в фи­гурные скобки, можно получить блок, рассматриваемый как единый оператор.

Программа в примере 5.5 зацикливает числа от 1 до 100, выводя и добавляя каждое число в общий итог.

Пример 5.5. Циклы C++ поддерживают составные операторы

#include <iostream.h>

int main()

{     int count;

  int total = 0;

for (count = 1; count <= 100; count++)

      { //Начало составного оператора

  cout << "Прибавляю " << count << " к " << total;

       total = total + count;

        cout << " получаю " << total << endl;

       } //Конец составного оператора

}

Группируя операторы внутри фигурных скобок, цикл for тем самым может выполнить несколько операторов за один проход.

Как и в случае с пустым оператором, вполне можно создать пустой блок. Для это­го используется пара фигурных скобок без операторов.

while (cin >> s && s != sought)

{ } // пустой блок

О входе в блок и выходе из блока речь пойдет в связи с операторами передачи управления (лабораторная работа 6).