Составные операторы применяются в случае, когда язык требует одного оператора, а логика программы нескольких. Например, тело цикла while
или for
составляет один оператор. Но в теле цикла зачастую необходимо выполнить несколько операторов. Заключив необходимые операторы в фигурные скобки, можно получить блок, рассматриваемый как единый оператор.
Для примера вернемся к циклу while
из кода в разделе 1.4.1.
while (val <= 10) {
sum += val; //
++val; //
}
Логика программы нуждалась в двух операторах, но цикл while
способен содержать только один оператор. Заключив эти операторы в фигурные скобки, получаем один (составной) оператор.
Как и в случае с пустым оператором, вполне можно создать пустой блок. Для этого используется пара фигурных скобок без операторов:
while (cin >> s && s != sought)
{ } //
Упражнение 5.1. Что такое пустой оператор? Когда его можно использовать?
Упражнение 5.2. Что такое блок? Когда его можно использовать?
Упражнение 5.3. Используя оператор запятой (см. раздел 4.10), перепишите цикл while
из раздела 1.4.1 так, чтобы блок стал больше не нужен. Объясните, улучшило ли это удобочитаемость кода.
5.2. Операторная область видимости
Переменные можно определять в управляющих структурах операторов if
, switch
, while
и for
. Переменные, определенные в управляющей структуре, видимы только в пределах этого оператора и выходят из области видимости по его завершении.
while (int i = get_num()) //
//
cout << i << endl;
i = 0; //
Если к значению управляющей переменной необходимо обращаться впоследствии, то ее следует определить вне оператора.
//
auto beg = v.begin();
while (beg != v.end() && *beg >= 0)
++beg;
if (beg == v.end())
//
Значение объекта, определенного в управляющей структуре, используется самой структурой. Поэтому такие переменные следует инициализировать.
Упражнение 5.4. Объясните каждый из следующих примеров, а также устраните все обнаруженные проблемы.
(a) while (string::iterator iter != s.end()) { /* ... */ }
(b) while (bool status = find(word)) { /* ... */ }
if (!status) { /* ... */ }
5.3. Условные операторы
Язык С++ предоставляет два оператора, обеспечивающих условное выполнение. Оператор if
разделяет поток выполнения на основании условия. Оператор switch
вычисляет результат целочисленного выражения и на его основании выбирает один из нескольких путей выполнения.
if
if
выполняет один из двух операторов в зависимости от истинности своего условия. Существуют две формы оператора if
: с разделом else
и без него. Синтаксис простой формы оператора if
имеет следующий вид:
if (
Оператор if else
имеет следующую форму:
if (
else
В обеих версиях
заключается в круглые скобки.
может быть выражением или инициализирующим объявлением переменной (см. раздел 5.2). Тип выражения или переменной должен быть преобразуем в тип bool
(см. раздел 4.11). Как обычно, и
, и
могут быть блоком.
Если
истинно,
выполняется. По завершении оператора выполнение продолжается после оператора if
.
Если
ложно,
пропускается. В простом операторе if
выполнение продолжается после оператора if
, а в операторе if else
выполняется
if else
Для иллюстрации оператора if else
вычислим символ оценки по ее числу. Подразумевается, что числовые значения оценок находятся в диапазоне от нуля до 100 включительно. Оценка 100 получает знак "А++", оценка ниже 60 — "F", а остальные группируются по десять: от 60 до 69 — "D", от 70 до 79 — "C" и т.д. Для хранения возможных символов оценок используем вектор:
vector
Для решения этой проблемы можно использовать оператор if else
, чтобы выполнять разные действия проходных и не проходных отметок.