5.1. Простые операторы
Большинство операторов в языке С++ заканчиваются точкой с запятой. Выражение типа ival + 5 становится оператором выражения (expression statement), завершающимся точкой с запятой. Операторы выражения составляют вычисляемую часть выражения.
ival + 5; // оператор выражения (хоть и бесполезный)
cout << ival; // оператор выражения
Первое выражение бесполезно: результат вычисляется, но не присваивается, а следовательно, никак не используется. Как правило, выражения содержат операторы, результат вычисления которых влияет на состояние программы. К таким операторам относятся присвоение, инкремент, ввод и вывод.
Пустые операторы
Самая простая форма оператора — это пустой (empty), или нулевой, оператор (null statement). Он представляет собой одиночный символ точки с запятой (;).
; // пустой оператор
Пустой оператор используется в случае, когда синтаксис языка требует наличия оператора, а логика программы — нет. Как правило, это происходит в случае, когда вся работа цикла осуществляется в его условии. Например, можно организовать ввод, игнорируя все прочитанные данные, пока не встретится определенное значение:
// читать, пока не встретится конец файла или значение,
// равное содержимому переменной sought
while (cin >> s && s != sought)
; // пустой оператор
В условии значение считывается со стандартного устройства ввода, и объект cin неявно проверяется на успешность чтения. Если чтение прошло успешно, во второй части условия проверяется, не равно ли полученное значение содержимому переменной sought. Если искомое значение найдено, цикл while завершается, в противном случае его условие проверяется снова, начиная с чтения следующего значения из объекта cin.
Остерегайтесь пропущенных и лишних точек с запятой
Поскольку пустой оператор является вполне допустимым, он может располагаться везде, где ожидается оператор. Поэтому лишний символ точки с запятой, который может показаться явно недопустимым, на самом деле является не более, чем пустым оператором. Приведенный ниже фрагмент кода содержит два оператора: оператор выражения и пустой оператор.
ival = v1 + v2;; // ok: вторая точка с запятой - это лишний
// пустой оператор
Хотя ненужный пустой оператор зачастую безопасен, дополнительная точка с запятой после условия цикла while или оператора if может решительно изменить поведение кода. Например, следующий цикл будет выполняться бесконечно:
// катастрофа: лишняя точка с запятой превратила тело цикла
// в пустой оператор
while (iter != svec.end()) ; // тело цикла while пусто!
++iter; // инкремент не является частью цикла
Несмотря на отступ, выражение с оператором инкремента не является частью цикла. Тело цикла — это пустой оператор, обозначенный символом точки с запятой непосредственно после условия.
Составные операторы (блоки)
Составной оператор (compound statement), обычно называемый блоком (block), представляет собой последовательность операторов, заключенных в фигурные скобки. Блок операторов обладает собственной областью видимости (см. раздел 2.2.4). Объявленные в блоке имена доступны только в данном блоке и блоках, вложенных в него. Как обычно, имя видимо только с того момента, когда оно определено, и до конца блока включительно.
Составные операторы применяются в случае, когда язык требует одного оператора, а логика программы нескольких. Например, тело цикла while или for составляет один оператор. Но в теле цикла зачастую необходимо выполнить несколько операторов. Заключив необходимые операторы в фигурные скобки, можно получить блок, рассматриваемый как единый оператор.
Для примера вернемся к циклу while из кода в разделе 1.4.1.
while (val <= 10) {
sum += val; // присвоить sum сумму val и sum
++val; // добавить 1 к val
}
Логика программы нуждалась в двух операторах, но цикл while способен содержать только один оператор. Заключив эти операторы в фигурные скобки, получаем один (составной) оператор.
Как и в случае с пустым оператором, вполне можно создать пустой блок. Для этого используется пара фигурных скобок без операторов:
while (cin >> s && s != sought)
{ } // пустой блок
Упражнения раздела 5.1
Упражнение 5.1. Что такое пустой оператор? Когда его можно использовать?
Упражнение 5.2. Что такое блок? Когда его можно использовать?
Упражнение 5.3. Используя оператор запятой (см. раздел 4.10), перепишите цикл while из раздела 1.4.1 так, чтобы блок стал больше не нужен. Объясните, улучшило ли это удобочитаемость кода.