Оператор ветвления if

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

if (<Логическое выражение>) {
   <Блок, выполняемый если условие истинно>
}
[else {
   <Блок, выполняемый если условие ложно>
}]

Если логическое выражение возвращает значение true (Истина), то выполняются инструкции, расположенные внутри фигурных скобок, сразу после оператора if. Если логическое выражение возвращает значение false (Ложь), то выполняются инструкции после ключевого слова else. Блок else является необязательным. Допускается не указывать фигурные скобки, если блоки состоят из одной инструкции. В качестве примера проверим число, введенное пользователем, на четность и выведем соответствующее сообщение (листинг 4.3).

Листинг 4.3. Проверка числа на четность

#include <iostream>
#include <clocale>

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   int x = 0;
   std::cout << "Введите целое число: ";
   std::cout.flush();
   std::cin >> x;
   if (!std::cin.good()) {
      std::cout << "Вы ввели не число" << std::endl;
      return 1;
   }
   else {
      if (x % 2 == 0)
         std::cout << x << " - четное число";
      else
         std::cout << x << " - нечетное число";
      std::cout << std::endl;
   }
   return 0;
}

Как видно из примера, один оператор ветвления можно вложить в другой. Первый оператор if проверяет отсутствие ошибки при вводе числа. Метод good() возвращает логическое значение true, если ошибок не произошло, или значение false — в противном случае. Обратите внимание на то, что логическое выражение не содержит операторов сравнения (кроме оператора !, который инвертирует значение):

if (!std::cin.good()) {

Проверка соответствия условия значению true производится по умолчанию. Так как при ошибке метод good() вернет значение false, следовательно, условие !false == true будет истинным. Это логическое выражение можно было записать так:

if (std::cin.good() == false) {

или так:

if (std::cin.good() != true) {

Однако подобные проверки в этом случае являются излишними. Достаточно указать название метода и при необходимости инвертировать значение.

Если ошибки при вводе числа нет, то выполняется блок else. В этом блоке находится второй оператор ветвления, который проверяет число на четность. В зависимости от условия x % 2 == 0 выводится соответствующее сообщение. Если число делится на 2 без остатка, то оператор % вернет значение 0, в противном случае — число 1. Обратите внимание на то, что оператор ветвления не содержит фигурных скобок:

if (x % 2 == 0)
   std::cout << x << " - четное число";
else
   std::cout << x << " - нечетное число";
std::cout << std::endl;

В этом случае считается, что внутри блока содержится только одна инструкция. Поэтому последняя инструкция к блоку else не относится. Она будет выполнена в любом случае, вне зависимости от условия. Чтобы это сделать наглядным, перед инструкциями, расположенными внутри блока, добавлено одинаковое количество пробелов. Если записать следующим образом, то ничего не изменится:

if (x % 2 == 0)
std::cout << x << " - четное число";
else
std::cout << x << " - нечетное число";
std::cout << std::endl;

Однако в дальнейшем разбираться в таком коде будет неудобно. Поэтому перед инструкциями внутри блока всегда следует размещать одинаковый отступ. В качестве отступа можно использовать пробелы или символ табуляции. При использовании пробелов размер отступа равняется трем или четырем пробелам для блока первого уровня. Для вложенных блоков количество пробелов умножают на уровень вложенности: если для блока первого уровня вложенности использовалось три пробела, то для блока второго уровня вложенности должно использоваться шесть пробелов, для третьего уровня — девять пробелов и т. д. В одной программе не следует использовать и пробелы, и табуляцию в качестве отступа. Необходимо выбрать что-то одно и пользоваться этим во всей программе.

При отсутствии пробелов или фигурных скобок чтение программы может вызывать затруднения. Даже если знаешь приоритет выполнения операторов, всегда закрадывается сомнение, и чтение программы останавливается. Например, к какому оператору if принадлежит блок else в этом примере?

if (x >= 0) if (x == 0) y = 0; else y = 1;

Задумались? А зачем задумываться об этом, если можно сразу расставить фигурные скобки? Ведь тогда никаких сомнений вообще не будет:

if (x >= 0) { if (x == 0) y = 0; else y = 1; }

А если сделать так, то чтение и понимание программы станет мгновенным:

if (x >= 0) {
   if (x == 0) y = 0;
   else y = 1;
}

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

// Стиль 1
if (<Логическое выражение>) {
   // Инструкции
}
else {
   // Инструкции
}
// Стиль 2
if (<Логическое выражение>) {
   // Инструкции
} else {
   // Инструкции
}
// Стиль 3
if (<Логическое выражение>)
{
   // Инструкции
}
else
{
   // Инструкции
}

Многие программисты считают Стиль 3 наиболее приемлемым, так как открывающая и закрывающая скобки расположены друг под другом. На мой же взгляд образуются лишние пустые строки. Так как размеры экрана ограничены, при наличии пустой строки на экран помещается меньше кода и приходится чаще пользоваться полосой прокрутки. Если размещать инструкции с равным отступом, то блок кода выделяется визуально и следить за положением фигурных скобок просто излишне. Тем более, что редактор кода позволяет подсветить парные скобки. Какой стиль использовать, зависит от личного предпочтения программиста или от правил оформления кода, принятых в определенной фирме. Главное, чтобы стиль оформления внутри одной программы был одинаковым. В этой книге мы будем пользоваться Стилем 1.

В листинге 4.3 при вложении операторов мы воспользовались следующей схемой:

if (<Условие 1>) {
   // Инструкции
}
else {
   if (<Условие 2>) {
      // Инструкции
   }
   else {
      // Инструкции
   }
}

Чтобы проверить несколько условий эту схему можно изменить так:

if (<Условие 1>) {
   // <Блок 1>
}
else if (<Условие 2>) {
   // <Блок 2>
}
// ... Фрагмент опущен ...
else if (<Условие N>) {
   // <Блок N>
}
else {
   // <Блок else>
}

Если <Условие 1> истинно, то выполняется <Блок 1>, а и все остальные условия пропускаются. Если <Условие 1> ложно, то проверяется <Условие 2>. Если <Условие 2> истинно, то выполняется <Блок 2>, а все остальные условия пропускаются. Если <Условие 2> ложно, то точно также проверяются остальные условия. Если все условия ложны, то выполняется <Блок else>. В качестве примера определим, какое число от 0 до 2 ввел пользователь (листинг 4.4).

Листинг 4.4. Проверка нескольких условий

#include <iostream>
#include <clocale>

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   int x = 0;
   std::cout << "Введите число от 0 до 2: ";
   std::cout.flush();
   std::cin >> x;
   if (!std::cin.good()) {
      std::cout << "Вы ввели не число" << std::endl;
      return 1;
   }
   else {
      if (x == 0)
         std::cout << "Вы ввели число 0" << std::endl;
      else if (x == 1)
         std::cout << "Вы ввели число 1" << std::endl;
      else if (x == 2)
         std::cout << "Вы ввели число 2" << std::endl;
      else {
         std::cout << "Вы ввели другое число" << std::endl;
         std::cout << "x = " << x << std::endl;
      }
   }
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов