- •1. Краткие теоретические сведения
- •1.4. Пустой оператор
- •1.5. Составной оператор (блок)
- •1.6. Операторы начала и конца программы
- •Int main()
- •1.7. Оператор return
- •1.8. Оператор присваивания
- •1.8.1. Множественное присваивание
- •1.8.2. Ошибки при присваивании
- •1.8.3. Не путайте операторы равенства и присвоения
- •1.8.4. Составные операторы присвоения
- •1.8.6. Присваивание значения при объявлении
- •1.9. Операторы ввода-вывода
- •1.10. Функции ввода и вывода
- •1.10.1. Функция printf
- •1.10.2. Функция scanf
- •1.11. Операторы потокового ввода и вывода
- •1.11.1. Использование cout для отображения вывода на экран
- •1.11.2. Использование cout для вывода чисел
- •1.11.3. Вывод нескольких значений одновременно
- •1.11.4. Использование специальных символов вывода
- •1.11.5. Другие специальные символы
- •1.11.5. Вывод восьмеричных и шестнадцатеричных значений
- •1.11.6. Вывод на стандартное устройство ошибок
- •1.11.7. Управление шириной вывода
- •1.11.8. Директива #define
- •1.11.9. Оператор потокового вывода cin
- •1.11.10. Второе знакомство с cin
- •1.11.11. Следите за ошибками переполнения
- •1.11.12. Следите за ошибками несовпадения типов
- •1.11.13. Чтение символьных данных
- •1.11.14. Чтение слов с клавиатуры
- •1.11.15. Чтение строковых данных
- •1.12. Комментарии. Использование пробелов
- •1.13. Линейный вычислительный процесс
- •1.16. Таблица выбора идентификаторов
- •2. Задание
- •2.10. Задания
- •2.10.1. Задание 1
- •2.10.2. Задание 2
- •2.10.3. Задание 3 (домашнее)
- •3. Выводы
- •4. Требование к отчету
- •5. Вопросы для самоконтроля
- •Литература
- •Оглавление
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).