Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
    1. Логические операторы

Логические операторы используются для повышения выразительных средств языка. В языке Си имеются три логических оператора:

● ! – логическое НЕ,

● && - логическое И,

● || - логическое ИЛИ.

Оператор ! является унарным оператором, а операторы && и || - бинарными. В качестве операндов логических операторов могут использоваться арифметические выражения, отношения и сравнения на равенство. Логические операции задаются с помощью так называемых таблиц истинности. Предположим, что имеются две логические величины a, b. Тогда таблицы истинности для рассматриваемых операторов можно представить в следующем виде:

a

b

Логическая операция

!a

!b

a && b

a || b

false

false

true

true

false

false

false

true

true

false

false

true

true

false

false

true

false

true

true

true

false

false

true

true

Значение результата выполнения оператора ! является обратным по отношению к его операнду. Значение, полученное в результате выполнения оператора &&, истинно только в том случае, когда истинны его оба операнда. Значение результата выполнения оператора || истинно в том случае, когда истинен хотя бы один операнд. Отметим, что бинарные операторы относятся к немногочисленной категории операторов, для которых фиксирован порядок вычисления операндов. Этот порядок выполнения состоит в следующем. Вначале всегда вычисляется левый операнд. Если после его вычисления значение выражения становится очевидным, то правый операнд не вычисляется. Например, если при вычислении выражения, содержащего оператор &&, значение левого операнда оказалось равным false, то из этого заведомо следует, что значением всего выражения будет логическое значение false. При этом необходимость в вычислении правого операнда отпадает.

    1. Поразрядные операторы

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

● ~ поразрядное НЕ,

● & поразрядное И,

● | поразрядное ИЛИ,

● ^ поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ,

● << сдвиг влево,

● >> сдвиг вправо.

Отметим, что поразрядные операторы применимы только к целочисленным операндам.

Краткое описание поразрядных операторов содержится в таблице, приведенной ниже.

Оператор

Название

Описание

~

Поразрядное НЕ

Все биты операнда, равные 0, устанавливаются в 1, а все биты, значения которых равны 1, устанавливаются в 0.

&

Поразрядное И

Бит результата устанавливается в 1 только в том случае, когда соответствующие биты обоих операндов установлены в 1, во всех других случаях этот бит устанавливается в 0.

|

Поразрядное ИЛИ

Бит результата устанавливается в 1 в том случае, когда хотя бы один из соответствующих битов операндов установлен в 1 и устанавливается в 0, если оба соответствующих бита, установлены в 0.

^

Поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ

Бит результата устанавливается в 1, если соответствующий бит одного и только одного операнда установлен в 1, во всех других случаях этот бит устанавливается в 0.

<<

Сдвиг влево

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

>>

Сдвиг вправо

Сдвигает вправо биты левого операнда на количество позиций, которое определяется правым операндом. Способ заполнения освобождающихся позиций является аппаратно – зависимым.

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

/* .....................*/ unsigned char n = 0x2A; unsigned char m = 0x71; unsigned char r;

r = ~n; printf("~n = %X\n", r); r = ~m; printf("~m = %X\n", r); r = n & m; printf("n & m = %X\n", r); r = n | m; printf("n | m = %X\n", r); r = n << 2; printf("n << 2 = %X\n", r); r = m >> 1; printf("m >> 1 = %X\n", r); /* ........................*/

Результаты выполнения этого фрагмента программы имели следующий вид:

~n = D5 ~m = 8E n & m = 20 n | m = 7B n << 2 = A8 m >> 1 = 38