Логические операторы и выражения
Оператор?: и сокращенная запись для if-else
В некоторых случаях конструкция if-else может оказаться громоздкой по сравнению с операторами, расположенными в ней. Например, для выбора максимума из двух чисел можно написать следующую программу:
int maximum;
if (x>y) {
maximum=x;
} else {
maximum=y;
}
Посмотрите, здесь переменная maximum встречается целых три раза, и весь фрагмент кода состоит из шести строчек. Для сокращения записи до одной строки служит оператор?:. Посмотрите, как перепишется код с ее помощью:
int maximum = x>y? x: y;
В общем виде оператор?: действует так:
<тип значения> <переменная> =
<проверяемое условие>? <значение для true>
: <значение для false>;
Оператор?: не обязан возвращать значение, другими словами, это значение может иметь тип void. Пример:
x>y? cout << "x>y": cout << "y>=x";
В качестве проверяемого выражения оператор if ожидает выражение, значение которого равно true или false. Такие выражения называются логическими. Внутри логических выражений могут быть другие выражения, но последняя операция (операция с наименьшим приоритетом) должна возвращать значение логического типа bool. Рассмотрим условие, которое присутствует в программе, проверяющей число на кратность 3:
|
|
if (number%3 == 0) {
…
}
Здесь % - это арифметическая операция взятия остатка от деления числа number на 3; остаток от деления на 3 может быть 0, 1 или 2. Результат операции сравнения == может принимать два значения: true (истина) и false (ложь); таким образом, результат этой операции имеет тип bool. При желании рассмотренный фрагмент кода можно переписать так:
bool isMultiply3 = number%3==0;
if (isMultiply3) {
…
}
Здесь результат сравнения number%3==0 присваивается переменной isMultiply3. Согласно приоритету вначале выполняется операция %, затем производится сравнение ==, дающее true или false, и последним происходит присваивание =.
В следующей таблице приведены операции сравнения.
Оператор | Название | Пример |
< | Меньше | x < y |
> | Больше | x > y |
<= | Меньше либо равно | x <= y |
>= | Больше либо равно | x >= y |
== | Равно | x == y |
!= | Не равно | x!= y |
В следующей таблице перечислены логические операции:
Оператор | Описание | Пример |
! | Не | !(a > b) |
&& | И | (5 < a) && (a < 10) |
|| | Или | (a == 5) || (a == 10) |
Напомним таблицу истинности для логических операций
x | y | !x | x&&y | x||y |
true | true | true | true | true |
true | false | - | false | true |
false | true | false | false | true |
false | false | - | false | false |
В своём исходном виде условная конструкция if-else предназначена для выбора между двумя альтернативами: если заданное условие истинно, то выполняется первая альтернатива, иначе – вторая. Например, в следующем фрагменте кода выполняется проверка того, является ли буква гласной:
|
|
if (<буква является гласной>) {
cout << "гласная\n";
} else {
cout << "согласная\n";
}
В некоторых случаях конструкция if-else может быть использована без ветки else. В следующих темах мы рассмотрим ряд содержательных примеров, когда данная конструкция применяется именно в таком виде. Сейчас же обратимся к несколько искусственному примеру: перепишем приведённую выше программу проверки буквы на гласность без использования ветки else. Для этого заметим, что, какой бы ни была буква, набор символов «гласная» выводится в любом случае, а приставка «со» - только в случае согласной буквы. Поэтому программа может состоять из двух шагов:
- вывести «со», если буква согласная;
- вывести «гласная» в любом случае.
В виде программного кода это выглядит так:
if (<буква является согласной>) {
cout << "со";
}
cout << "гласная\n";