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