Программирование >>  Аргументация конструирования 

1 ... 8 9 10 [ 11 ] 12 13 14 ... 108


Выполнение логических операций

В 3iiluu главе...

Зачем нужны логические операторы Использование простых логических операторов Бинарные числа в С + + Выполнение битовых логических операций

айболее распространенной сиптаксической конструкцией С + + является выра-* жение. Большинство используемых выражений содержит арифметические операторы сложения (+), вычитания (-) и умножения {*). В данной главе описаны все

эти типы выражений.

Существует целый класс так называемых логических операторов. В отличие от арифметических, этот тип операторов многими не воспринимается как операторы.

Неправда, что люди не сталкиваются с логическими операторами. Значения операторов И и ИЛИ они вычисляют постоянно. Я не буду есть овсянки без молока И сахара. И закажу себе ром ИЛИ шотландский виски. Как видите, люди очень часто используют логические операторы, не осознавая этого.

Логические операторы бывают двух типов. Операторы И и ИЛИ называются простыми логическими операторами. Операторы второго типа, или битовые операторы, уникальны, так как используются только в программировании. Этот тип операторов позволяет работать с любым битом в машинном представлении числа.

Зачежны логические OHefunMofibi

У вас может возникнуть вопрос: Если до сегодняшнего дня меня совершенно не волновали логические операторы, почему это должно случиться теперь?1. Да потому, что программы должны уметь принимать решения. Программы, написанные без принятия решений, по сложности подобны приведенной в первой главе (вспомните, что все выполняемые ею действия совершенно Для принятия ре-

шений в программах просто необходимо использовать логические операторы.

использование nftocibtx логическихопфа01О/го

Программы на C++ должны обладать способностью принимать решения. Программа Convert не выполняла ничего, кроме простого преобразования значений температуры, и не принимала никаких решений, основанных на входных значениях. Для принятия таких решений в программах C++ используют логические операторы.

Простые логические операторы приведены в табл. 4.1. Они могут возвращать два значения: true (истина) и false (ложь).




Таблице 1. Простыеоператорыизповседневнойлогики

ОПЕРАТОР ЗНАЧЕНИЕ

Равенство; истинно, когда значение левого аргумента совпадает со значением правого != Неравенство; противоположно равенству

> , < Больше, меньше; истинно, когда значение левого выражения больше и меньше) зна-

чения правого

>= = Больше или равно, меньше или равно; истинно, если истиной является > или ~= (юответственно < или ==}

Siii И; истинно, если аргументы и слева и справа являются истиной

I I ИЛИ; истинно, если или левый, или правый аргумент являются истиной

! НЕ; истинно, если его аргумент принимает ложное значение

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

п == 0;

Не перепутайте оператор равенства == с оператором присвоения =. Эта ошибка очень распространена, к тому же компилятор C + + , вообще говоря, не считает ее ошибкой, что делает ее вдвойне опасной!

п = 0; Программист хоте сать, что п == О

Широко распространены в повседневной жизни операторы больше (>) и меньше (<). Приведем пример логического выражения, возвращающего значение true.

int nl = 1;

int n2 = 2; nl < n2

Операторы больше и меньше внешне очень похожи, и поэтому их легко перепутать. Чтобы этого не случилось, помните, что оператор-стрелочка принимает значение true в том случае, когда из двух сравниваемых значений он указывает на меньшее.

С помощью операторов > и < можно найти случаи, когда nl больше или меньше п2, однако при этом игнорируется возможность равенства их значений. Операторы больше или равно (>=), меньше или равно (<=), в отличие от только что рассмотренных, учитывают и эту возможность.

Так же широко используются и операторы s& (И) и (ИЛИ). Эти операторы обычно сочетаются с другими логическими операторами:

истинно, если п2 больше nl и меньше пЗ (п1 < п21 (п2 < пЗ);

В качестве ремарки: оператор больше или равно можно определить как п1 <= п2 эквивалентно (п1 < п2) (п1 п2)

Логические операции и действительные переменные

Переменные с плавающей точкой, как уже отмечалось, не могут использоваться для перечисления. Вы можете сказать: первый, второй, третий, четвертый и т.д., так

В качестве ещ ной ремарки: операторы сравнения вообще достаточно взаимозаменяемы. Так, например -Ь) эквивалентно (! (а>Ь) && Ь) ).- Прим. ред.



как соотношения между 1, 2, 3 абсолютно точно известны. Но нет никакого смысла говорить о номере 4.535887 в последовательности (такой способ нумерации возможен лишь как обозначение чего-то между четвертым и пятым, но не действительного значения номера, так как в любом сколь угодно малом отрезке их несчетное множество).

Тип float, представляющий в С + + действительные числа, не является перечне-лимы.м. Кроме того, в отличие от действительных чисел, числа с плавающей точкой имеют ограниченное количество разрядов, поэтому при использовании операторов сравнения с числами с плавающей точкой необходимо соблюдать осторожность. Рассмотрим следующий пример:

f] == (f2 * 3. Z Равны ли эти значения?

Сравнивая начальное и полученное значения, мы не обязательно получим равенство. Действительные переменные, с которыми работает компьютер, не могут содержать бесконечного числа значимых разрядов. Поэтому f2 равняется, например,

3.3333, а не В отличие от математики, в компьютере число троек после точки

ограничено. Умножив 3.3333 на 3, вы, вероятно, получите не 10.0, а 9.9999. Такой маленькой разницей может пренебречь человек, но не компьютер. Эта машина понимает под равенством исключительно точное равенство значений.

В современных процессорах выполнение таких вычислений очень усложнено. Процессор может даже устранить ошибку округления, но точно определить, когда именно процессору вздумается это сделать, язык C++ не способен.

Проблемы могут появиться и при совершенно простых вычислениях, например:

float fl = 10.0; float 12 = 120 t 11;

fl == f2; истинно ли это выражение?

Теоретически f 1 и f 2 должны быть равны (об операции деления по модулю можно

прочитать в главе 3, Выполнение математических операций ). Ошибка округления

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

Позвольте порекомендовать более безопасное сравнение:

float fl = 10.0; float f2 = fl / 3; float f3 = n * 3.0;

(fl - f3) < 0.0001 SS (f3 - fl) < C.OOOl;

Оно ИСТИННО В ТОМ случае, если разница между f 1 и f2 меньше какого-то малого

значения (в нашем случае - 0.0001); при этом небольшие погрешности вычислений

на правильность сравнения не повлияют.

Сокращенные вычисления в C++

Рассмотрим следующую конструкцию: условие! && условие2

Если условие1 ложно, то результат не будет истинным, независимо от истинности выражения условие2. В схеме

условие1 условие2

в случае истинности выражения неважно, какое значение принимает усло-

вие2, - результат будет истинным.

Более того, в данном случае это не красивое слово, а строгий математический термин. - Прим. ред.



1 ... 8 9 10 [ 11 ] 12 13 14 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика