Освой самостоятельно С++ за 21 день.
Шрифт:
Пользователь ввел число 20, поэтому оператор if в строке 11 возвратил значение true; однако оператор if в строке 13 возвратил false, поэтому сообщение не было выведено на экран. Было бы лучше, если бы программист использовал еще один оператор else после строки 14, который выводил бы сообщение о том, что введенное число не отвечает требованиям.
Примечание:Программы, приведенные в этой книге, написаны для демонстрации частных вопросов, рассматриваемых в данном разделе. Они намеренно написаны как можно проще; при этом не ставилась цель предусмотреть все возможные ошибки,
Логические операторы
Довольно часто у нас возникает необходимость проверять не одно условное выражение, а сразу несколько. Например, правда ли, что x больше у, а также что у больше z? Наша программа, прежде чем выполнить соответствующее действие, должна установить, что оба эти условия истинны либо одно из них ложно.
Представьте себе высокоорганизованную сигнальную систему, обладающую следующей логикой. Если сработала установленная на двери сигнализация И время суток после шести вечера, И сегодня НЕТ праздника ИЛИ сегодня выходной, нужно вызывать полицию. Для проверки всех условий нужно использовать три логических оператора C++. Они перечислены в табл. 4.2.
Таблица 4.2. Логические операторы
Логическое И
Логический оператор И вычисляет два выражения, и если оба выражения возвращают true, то и оператор И также возвращает true. Если правда то, что вы голодны, И правда то, что у вас есть деньги, значит, справедливо и то, что вы можете пойти в супермаркет и купить себе что-нибудь на обед. Например, логическое выражение
if ( (x == 5) && (у == 5) )
возвратит значение true, если и обе переменные — x и у — равны 5. Это же выражение возвратит false, если хотя бы одна из переменных не равна 5. Обратите внимание, что выражение возвращает true только в том случае, если истинны обе его части.
Логический оператор И обозначается двумя символами &&. Одиночный символ & соответствует совсем другому оператору, о котором пойдет речь на занятии 21.
Логическое ИЛИ
Логический оператор ИЛИ также вычисляет два выражения. Если любое из них истинно, то и оператор ИЛИ возвращает true. Если у вас есть деньги ИЛИ у вас есть кредитная карточка, вы можете оплатить счет. При этом нет необходимости в соблюдении двух условий сразу: иметь и деньги, и кредитную карточку. Вам достаточно выполнения одного из них (хотя и то и другое — еще лучше). Например, выражение
if ( (x == 5) || (у == 5) )
возвратит значение true, если либо значение переменной x, либо значение переменной у, либо они оба равны 5.
Обратите внимание: логический оператор ИЛИ обозначается двумя символами 11. Оператор, обозначаемый одиночным символом |, — это совсем другой оператор, о котором пойдет речь на занятии 21.
Логическое НЕТ
Логический оператор НЕТ возвращает значение true, если тестируемое выражение является ложным (имеет значение false). И наоборот, если тестируемое выражение является истинным, то оператор НЕТ возвратит false! Например, выражение
if ( !(x == 5) )
возвратит значение true только в том случае, если x не равно числу 5. Это же выражение можно записать и по-другому:
if (x != 5)
Вычисление по сокращенной схеме
Предположим, компилятору повстречалось следующее логическое выражение:
if ( (x == 5) && (у == 5) )
В таком случае компилятор сначала оценит первое выражение (x == 5) и, если оно возвратит false (т.е. x не равно числу 5), не станет вычислять второе выражение (у == 5), поскольку для истинности всего выражения с оператором И нужно, чтобы обе его составляющие были истинными.
Аналогично, если компилятору повстречается выражение с оператором ИЛИ
if ( (x == 5) || (у == 5) )
и первое выражение окажется истинным (x == 5), то компилятор также не станет вычислять второе выражение (у == 5), поскольку ему достаточно одного истинного результата, чтобы признать истинным все выражение.
Приоритеты операторов отношений
Операторы отношений и логические операторы используются в выражениях языка C++ и возвращают значения true или false. Подобно всем другим операторам, им присущ некоторый уровень приоритета (см. приложение А), который определяет порядок вычисления операторов отношений. Этот момент нужно обязательно учитывать при определении значения такого выражения, как
if ( x > 5 && у > 5 || 2 > 5)
В данном случае о намерениях программиста можно только догадываться. Возможно, он хотел, чтобы это выражение возвращало значение true, если x и у больше 5 или если z больше 5. С другой стороны, может быть, программист хотел, чтобы это выражение возвращало true только в том случае, если x больше 5 и либо у, либо z больше 5.
Если x равен 3, а у и z оба равны 10, то при использовании первой интерпретации намерений программиста это выражение возвратит значение true (z больше 5, поэтому игнорируем значения x и у), но при использовании второй интерпретации вернется значение false (oHp не может дать значение true, поскольку для этого требуется, чтобы значение x было больше 5, а после установления этого факта результат вычисления выражения справа от оператора && не важен, ведь для истинности всего выражения обе его части должны быть истинными).
Разобраться в приоритетах операторов в подобных выражениях довольно сложно, поэтому стоит воспользоваться круглыми скобками — ведь с их помощью можно не только изменить последовательность выполнения операторов, обусловленную их приоритетами, но и сделать ясными подобные запутанные выражения:
if ( (x > 5) && (у > 5 | | z > 5) )
При использовании предложенных выше значений это выражение возвращает значение false. Поскольку оказалось, что x (его значение равно 3) не больше 5, то выражение слева от оператора И возвращает false, а следовательно, и все выражение целиком тоже возвратит false. Помните, что оператор И возвращает true только в том случае, когда обе части выражения возвращают true. Например, ваш вкус можно считать хорошим только в том случае, если о надетой на вас вещи можно сказать, что она модная и что вам она идет.