4.10 – Знакомство с операторами if
Рассмотрим случай, когда вы собираетесь пойти на рынок, и ваш сосед по комнате говорит вам: «Если у них есть клубника по скидке, купи». Это условное утверждение, означающее, что вы выполните какое-то действие («купите»), только если условие («у них есть клубника по скидке») верно.
Такие условия распространены в программировании, поскольку они позволяют нам реализовать в наших программах условное поведение. Самый простой вид условного оператора в C++ называется оператором if
. Оператор if
позволяет нам выполнять одну (или несколько) строк кода только в том случае, если выполняется какое-то условие.
Простейший оператор if принимает следующую форму:
if (условие) инструкция_выполняемая_если_условие_верно;
Для удобства чтения он чаще записывается следующим образом:
if (условие)
инструкция_выполняемая_если_условие_верно;
Условие (также называемое условным выражением) – это выражение, результатом которого является логическое значение.
Если условие оператора if
оценивается как логическое значение true
, то выполняется инструкция_выполняемая_если_условие_верно. Если вместо этого условие принимает логическое значение false, то инструкция_выполняемая_если_условие_верно пропускается.
Пример программы с использованием оператора if
Рассмотрим следующую программу:
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
if (x == 0)
std::cout << "The value is zero\n";
return 0;
}
Вот результат одного запуска этой программы:
Enter an integer: 0
The value is zero
Давайте рассмотрим, как это работает более подробно.
Сначала пользователь вводит целое число. Затем вычисляется условие x == 0
. Оператор равенства (==
) используется для проверки равенства двух значений. operator==
возвращает true
, если операнды равны, и false
, если они не равны. Поскольку x
имеет значение 0, а 0 == 0
истинно, это выражение оценивается как истинное.
Поскольку условие оценивается как true
, выполняется следующая инструкция, выполняющая печать «The value is zero».
Вот результат еще одного запуска этой программы:
Enter an integer: 5
В этом случае x == 0
оценивается как false
. Следующая инструкция пропускается, программа завершается и больше ничего не печатается.
Предупреждение
Операторы if
условно выполняют только одну инструкцию. О том, как условно выполнять несколько инструкций, мы говорим в уроке «7.2 – Операторы if
и блоки».
if
-else
Учитывая пример, приведенный выше, что, если бы мы хотели сообщить пользователю, что введенное число не равно нулю?
Мы могли бы написать что-то вроде этого:
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
if (x == 0)
std::cout << "The value is zero\n";
if (x != 0)
std::cout << "The value is non-zero\n";
return 0;
}
Или этого:
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
bool zero { (x == 0) };
if (zero)
std::cout << "The value is zero\n";
if (!zero)
std::cout << "The value is non-zero\n";
return 0;
}
Обе эти программы сложнее, чем нужно. Вместо этого мы можем использовать альтернативную форму оператора if
, называемую if
-else
. if
-else
принимает следующую форму:
if (условие)
инструкция_выполняемая_если_условие_верно;
else
инструкция_выполняемая_если_условие_неверно;
Если условие принимает логическое значение true
, выполняется инструкция_выполняемая_если_условие_верно. В противном случае выполняется инструкция_выполняемая_если_условие_неверно.
Давайте изменим нашу предыдущую программу, чтобы использовать if
-else
.
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
if (x == 0)
std::cout << "The value is zero\n";
else
std::cout << "The value is non-zero\n";
return 0;
}
Теперь наша программа выдаст следующий результат:
Enter an integer: 0
The value is zero
Enter an integer: 5
The value is non-zero
Объединение операторов if
в цепочку
Иногда мы хотим проверить, являются ли несколько вещей верными или ложными по порядку. Мы можем сделать это, связав оператор if
с предыдущим if
-else
, например:
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
if (x > 0)
std::cout << "The value is positive\n";
else if (x < 0)
std::cout << "The value is negative\n";
else
std::cout << "The value is zero\n";
return 0;
}
Оператор «меньше» (<
) используется для проверки того, меньше ли одно значение другого. Точно так же оператор «больше» (>
) используется для проверки того, больше ли одно значение другого. Оба эти оператора возвращают логические значения.
Вот результат нескольких запусков этой программы:
Enter an integer: 4
The value is positive
Enter an integer: -3
The value is negative
Enter an integer: 0
The value is zero
Обратите внимание, что вы можете объединять операторы if
в цепочку столько раз, сколько у вас есть условий, которые вы хотите проверить. В тесте мы увидим пример, где это будет полезно.
Логические возвращаемые значения и операторы if
В предыдущем уроке (4.9 – Логические (булевы) значения) мы написали программу, использующую функцию, которая возвращает логическое значение:
#include <iostream>
// возвращает true, если x и y равны, иначе false
bool isEqual(int x, int y)
{
// operator== returns возвращает true, если x равно y, и false в противном случае
return (x == y);
}
int main()
{
std::cout << "Enter an integer: ";
int x{};
std::cin >> x;
std::cout << "Enter another integer: ";
int y{};
std::cin >> y;
std::cout << std::boolalpha; // выводим логические значения как true или false
std::cout << x << " and " << y << " are equal? ";
std::cout << isEqual(x, y); // вернет true или false
return 0;
}
Давайте улучшим эту программу с помощью оператора if
:
#include <iostream>
// возвращает true, если x и y равны, иначе false
bool isEqual(int x, int y)
{
// operator== возвращает true, если x равно y, и false в противном случае
return (x == y);
}
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
std::cout << "Enter another integer: ";
int y {};
std::cin >> y;
if (isEqual(x, y))
std::cout << x << " and " << y << " are equal\n";
else
std::cout << x << " and " << y << " are not equal\n";
return 0;
}
Результаты двух запусков этой программы:
Enter an integer: 5
Enter another integer: 5
5 and 5 are equal
Enter an integer: 6
Enter another integer: 4
6 and 4 are not equal
В этом случае наше условное выражение – это просто вызов функции isEqual
, которая возвращает логическое значение.
Небулевы условные выражения
Во всех приведенных выше примерах нашими условиями были либо логические значения (true
или false
), либо логические переменные, либо функции, возвращающие логическое значение. Что произойдет, если ваше условное выражение является выражением, которое не вычисляет логическое значение?
В таком случае условное выражение преобразуется в логическое значение: ненулевые значения преобразуются в логическое значение true
, а нулевые значения преобразуются в логическое значение false
.
Следовательно, если мы сделаем что-то вроде этого:
#include <iostream>
int main()
{
if (4) // бессмысленно, но для примера...
std::cout << "hi";
else
std::cout << "bye";
return 0;
}
Эта программа напечатает "hi", поскольку 4 – ненулевое значение, которое преобразуется в логическое значение true
, что приводит к выполнению инструкции, прикрепленной к if
.
Мы продолжим изучение операторов if
в следующем уроке «7.2 – Операторы If и блоки».
Небольшой тест
Вопрос 1
Простое число (prime number) – это целое число больше 1, которое может делиться без остатка только на 1 и на само себя. Напишите программу, которая просит пользователя ввести однозначное целое число. Если пользователь вводит простое число (2, 3, 5 или 7), выведите «The digit is prime». В противном случае выведите «The digit is not prime».
Подсказка
Используйте цепочку операторов if
-else
, чтобы сравнить число, введенное пользователем, с простыми числами, чтобы увидеть, есть ли совпадение.
Ответ
#include <iostream>
bool isPrime(int x)
{
if (x == 2) // если пользователь ввел 2, цифра простая
return true;
else if (x == 3) // если пользователь ввел 3, цифра простая
return true;
else if (x == 5) // если пользователь ввел 5, цифра простая
return true;
else if (x == 7) // если пользователь ввел 7, цифра простая
return true;
return false; // если пользователь не ввел 2, 3, 5, 7, цифра должна быть не простой
}
int main()
{
std::cout << "Enter a single digit integer: ";
int x {};
std::cin >> x;
if ( isPrime(x) )
std::cout << "The digit is prime\n";
else
std::cout << "The digit is not prime\n";
return 0;
}
Для продвинутых читателей
Если приведенная выше функция isPrime()
кажется немного многословной и повторяющейся – это так и есть. Мы можем написать isPrime()
более компактно и эффективно, используя некоторые концепции, которые мы объясним в будущих уроках.
Использование оператора логического ИЛИ (||
) (5.7 – Логические операторы):
bool isPrime(int x)
{
if (x == 2 || x == 3 || x == 5 || x == 7) // если пользователь ввел 2, 3, 5 или 7, цифра простая
return true;
return false; // иначе цифра должна быть не простой
}
Использование оператора условного переключения (7.4 – Основы работы с оператором switch
):
bool isPrime(int x)
{
switch (x)
{
case 2: // если пользователь ввел 2
case 3: // или если пользователь ввел 3
case 5: // или если пользователь ввел 5
case 7: // или если пользователь ввел 7
return true; // тогда цифра простая
}
return false; // иначе цифра должна быть не простой
}
Вопрос 2
Как можно уменьшить длину следующего кода (без изменения форматирования)?
#include <iostream>
bool isAllowedToTakeFunRide()
{
std::cout << "How tall are you? (cm)\n";
double height{};
std::cin >> height;
if (height > 140.0)
return true;
else
return false;
}
int main()
{
if (isAllowedToTakeFunRide())
std::cout << "Have fun!\n";
else
std::cout << "Sorry, you're too short.\n";
return 0;
}
Ответ
Нам не нужен оператор if
в isAllowedToTakeFunRide()
. Выражение height > 140.0
вычисляется как bool
, которое может быть возвращено напрямую.
bool isAllowedToTakeFunRide()
{
std::cout << "How tall are you? (cm)\n";
double height{};
std::cin >> height;
return (height > 140.0);
}
Вам никогда не понадобится выражение if
в следующей форме:
if (условие)
return true;
else
return false;
Его можно заменить одной инструкцией return
с возвратом условного выражения.