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

Логические операторы

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

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

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

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

Оператор ! является унарным оператором, а операторы && и || - бинарными. В качестве операндов логических операторов могут использоваться арифметические выражения, отношения и сравнения на равенство. Логические операции задаются с помощью так называемых таблиц истинности. Предположим, что имеются две логические величины 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. При этом необходимость в вычислении правого операнда отпадает.

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

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

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

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

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

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

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

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

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

 

Оператор Название Описание
~ Поразрядное НЕ Все биты операнда, равные 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

 

19. Условные выражения (оператор ?:)

Условные выражения записываются с помощью тернарного оператора ?:. Этот оператор имеет следующий формат:

выр1 ? выр2 : выр3

Здесь выр1, выр2 и выр3 – выражения.

Условное выражение вычисляется следующим образом. Вначале оценивается булевское значение выражения выр1. Если его значением является true, то дальше вычисляется значение выражения выр2 и значение этого выражения становится значением всего условного выражения, в противном случае вычисляется значение выражения выр3 и его значение становится значением всего условного выражения.

В качестве примера применения условного выражения рассмотрим задачу о нахождении наибольшего значения двух вещественных чисел a и b. Ниже приведена программа, предназначенная для решения этой задачи.

 

/* Файл max.c */
#include<stdio.h>
int main(void)
{
double a, b;
printf(“a=”);
scanf(“%lf”, &a);
printf(“b=”);
scanf(“%lf”, &b);
printf(“max=%8.3f\n”, (a > b ? a : b));
return 0;
}

Здесь использовалось то обстоятельство, что условное выражение действительно является выражением, и оно может быть использовано в качестве аргумента в вызове функции printf().