Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб по С и C++.doc
Скачиваний:
216
Добавлен:
25.03.2015
Размер:
1.34 Mб
Скачать

Операции сравнения

== - равно или эквивалентно;

!= - не равно;

< - меньше;

<= - меньше либо равно;

> - больше;

>= - больше либо равно.

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

Общий вид операций отношений:

<выражение 1> <знак операции> <выражение 2>

Общие правила:

- операндами могут быть любые базовые (скалярные) типы;

- значения выражений перед сравнением преобразуются к одному типу;

- результат операции отношения - значение 1, если отношение истинно, или 0 в противном случае (ложно). Следовательно, операция отношения может использоваться в любых арифметических выражениях.

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

Логические операции (в порядке убывания относительного приоритета) и их обозначения:

! - отрицание (логическое НЕТ);

&& - конъюнкция (логическое И);

|| - дизъюнкция (логическое ИЛИ).

Общий вид операции отрицания:

!<выражение>

Общий вид операций конъюнкции и дизъюнкции

<выражение 1> <операция> <выражение 2>

Например:

y>0 && x=7→ истина, если 1-е и 2-е выражения истинны;

e>0 || x=7 → истина, если хотя бы одно выражение истинно.

Ненулевое значение операнда - истина, а нулевое -ложь, например:

!0 → 1

!5 → 0

x=10;

!((x=y)>0) → 0

Особенность операций конъюнкции и дизъюнкции – экономное последовательное вычисление выражений-операндов:

<выражение 1> <операция> <выражение 2>

- если выражение 1 операции конъюнкция ложно, то результат операции ноль ивыражение 2 не вычисляется;

- если выражение 1 операции дизъюнкция истинно, то результат операции единица ивыражение 2 не вычисляется.

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

0<x<100 ↔ (0<x) && (x<100)

Побитовые логические операции, операции над битами

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

~ - дополнение (унарная операция); инвертирование (одноместная операция);

& - побитовое И - конъюнкция;

| - побитовое включающее ИЛИ - дизъюнкция;

^ - побитовое исключающее ИЛИ - сложение по модулю 2;

>> - сдвиг вправо;

<< - сдвиг влево.

Общий вид операции инвертирования:

~ <выражение>

Остальные операции над битами имеют вид

<выражение 1> <знак операции> <выражение 2>

Операндами операций над битами могут быть только выражения, приводимые к целому типу. Операции (~, &, |, ^) выполняются поразрядно над всеми битами операндов (знаковый разряд особо не выделяется):

~0xF0 ↔ x0F

0xFF & 0x0F ↔ x0F

0xF0 | 0x11 ↔ xF1

0xF4 ^ 0xF5 ↔ x01

Операция & часто используется для маскирования некоторого множества бит. Например, оператор w =n & 0177 передает вw семь младших битn, полагая остальные равными нулю.

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

Операция (!) используется для включения бит w =x !y, устанавливает в единицу те биты вx, которые =1 вy. Необходимо отличать побитовые операции & и ! от логических операций && и ||, еслиx=1,y=2, тоx &y равно нулю, аx &&y равно 1.

0x81<<1 ↔ 0x02

0x81>>1 ↔ 0x40

Если выражение 1 имеет типunsigned, то при сдвиге вправо освобождающиеся разряды гарантированно заполняются нулями (логический сдвиг). Выражения типаsigned могут, но необязательно, сдвигаться вправо с копированием знакового разряда (арифметический сдвиг). При сдвиге влево освобождающиеся разряды всегда заполняются нулями. Есливыражение 2 отрицательно либо больше длинывыражения 1 в битах, то результат операции сдвига не определен.

Унарная операция (~) дает дополнение к целому, т.е. каждый бит со значением 1 получает значение 0 и наоборот. Эта операция оказывается полезной в выражениях типа

X & (~)077,

где последние 6 бит X маскируются нулем.

Операции сдвига << и >> осуществляют соответственно сдвиг вправо (влево) своего левого операнда на число позиций, задаваемых правым операндом, например, x<<2 сдвигаетx влево на две позиции, заполняя освобождающиеся биты нулями (эквивалентно умножению на 4). Операции сдвига вправо наk разрядов весьма эффективны для деления, а сдвиг влево - для умножения целых чисел на 2 в степениk:

x<<1 ↔ x*2;

x>>1 ↔ x/2

x<<3 ↔ x*8

Подобное применение операций сдвига безопасно для беззнаковых и положительных значений выражения 1.

В математическом смысле операнды логических операций над битами можно рассматривать как отображение некоторых множеств с размерностью не более разрядности операнда на значения {0,1}.

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

~ - дополнение;

| - объединение;

& - пересечение.

Простейшее применение - проверка нечетности целого числа:

int i;

...

if ( i &1) printf (" Значение i четно!");

Комбинирование операций над битами с арифметическими операциями часто позволяет упростить выражения.