Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DOROGOVA.pdf
Скачиваний:
245
Добавлен:
05.06.2015
Размер:
853.4 Кб
Скачать

∙ Результат всего выражения будет иметь тип double.

3.4.2. Явное преобразование типов

Явное приведение значения одного типа к другому выполняется с помощью специальной операции.

Допускается преобразования к типу данных с меньшим объемом памяти, но следует помнить, что в этом случае будет потеряна часть информации.

Формат операции приведения типа: (имя_типа) операнд

Операндом может быть:

Переменная.

Константа.

Выражение в круглых скобках. Примеры преобразования констант:

(long)6

длина целой константы 6

равна 4

байта;

(char)6

длина целой константы 6

равна 1

байт.

Заметим, что при подобных преобразованиях значения констант и их внутреннее представление не меняется, так как типы char, int, long являются целым типами и отличаются только размером выделенной

памяти.

 

(double)6

длина целой константы 6 равна 8 байт

В данном случае значение константы не меняется, но меняется ее внутреннее представление, так как целая константа 6 преобразуется в вещественную константу 6, а следовательно, ей выделяется память под мантиссу и порядок.

Примеры преобразования переменных: int a,b,c;

double x;

// результат правой части выражения целое, поэтому общий результат будет округлен до ближайшего

целого значения x=(a+b)/c;

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

x=(double)(a+b)/c;

x=(a+b)/(double)c;

Заметим, что в нижеследующих примерах преобразования типов выполняются только в выражениях, ни тип, ни значение самих переменных i, l, d при этом не меняются.

int i=2;

 

long l=2;

 

double d;

 

float f;

 

d=(double)i * (double)l;

// I и l преобразуются в double

f=(float)d;

// d преобразуются во float

3.5.Тернарная или условная операция

Вязыке С есть единственная операция с тремя операндами, она обеспечивает выбор одного из двух выражений в зависимости от условия, поэтому её часто называют условной операцией (рис. 3.1.).

Условная операция имеет следующую форму:выражение1 ? выражение2: выражение3

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

выражение1 сравнивается с нулем;

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

если выражение1 равно нулю, то вычисляется выражение3, и его значение является результатом операции.

Заметим, что всегда вычисляется какой-либо один операнд (операнд2, либо операнд3), но не оба.

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Рис. 3.1. Схема условного оператора

Пример: переменной max присваивается максимальное значение из двух переменных а и b. max = a<=b ? b: a;

В примере используются две операции:

тернарная операция a<=b ? b: a , её результат есть максимальное значение из a ,b;

операция присваивания заносит результат тернарной операции в переменную max.

Если в условной операции операнд2 и операнд3 являются адресными выражениями, то тернарная операция может стоять слева от знака присваивания:

Пример: значение выражения c*x+d присваивается меньшей, из переменных a и b. a< b? a:b = c*x+d;

Если a<b, то вычисляется выражение a = c*x+d, иначе b = c*x+d.

3.6. Логические операции и операции отношения

Операции отношения используются для проверки условий это бинарные операторы (операторы с друмя операндами). В качестве первого операнда может выступать переменная или константа, которая сравнивается со вторым операндом литералом, переменной или константой. Результат сравнения всегда логический – TRUE (истина или "да") либо FALSE (ложь или "нет"). В языке С FALSE кодируется нулем, а

все что не нуль, то TRUE. Поэтому логические переменные TRUE и FALSE можно заменять целыми

переменными типа int.

Коперациям отношения относятся:

>больше;

<меньше;

>=

больше или равно;

<=

меньше или равно.

Все они имеют одинаковый ранг. Непосредственно за ними по уровню старшинства следуют операции сравнении на равенство и неравенство:

= =

равно (сравнение);

!=

не равно.

Операции отношения ниже рангом, чем арифметические операции, поэтому выражения типа: i < lim+3

понимаются как i < (lim+3).

Примеры: простые логические выражения: 3>7 результат 0 (FALSE);

8>1 результат 1 (TRUE ); 3==6 результат 0 (FALSE); 2 !=0 результат 1 (TRUE).

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

К логическим операциям относятся:

&&логическое "И" (конъюнкция), бинарная операция;

|| логическое "ИЛИ" (дизъюнкция), бинарная операция.

!логическое "НЕ" (отрицание), унарная операция.

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

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

Так же как и у операций отношения, у логических операций результат бинарный TRUE или FALSE (0 или 1).

Легче всего результаты логических операций представить в виде "таблиц истинности", которые можно сравнить, с таблицами умножения. Также как в таблице умножения, в таблице истинности приводится результат операции при всех возможных значениях операндов. Таблица 3.1. объединяет три таблицы истинности для основных логических операций. Столбцы x&&y , x || y и !x соответственно дают результаты логических операций "И", "ИЛИ" и "НЕ" при всех возможных сочетаниях операндов x и y.

Таблица 3.1

 

x

y

x && y

x || y

!x

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

0

1

 

 

 

 

 

 

 

 

 

 

 

 

 

0

1

0

1

1

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

0

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

1

1

0

 

 

 

 

 

 

Пример:

 

 

 

 

(0&&1)

 

результат 0 (нет);

 

 

(0 || 1)

 

результат 1 (да);

 

 

(!1)

 

результат 0 (нет);

 

 

(!0)

 

результат 1 (да).

 

 

Примеры сложных логических связок.

 

3 != 5 || 3==5

результат 1 (да);

3+4>5 && 3+5>4 && 4+5>0

результат 1 (да).

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

Пример:

Записать условие принадлежности переменной x диапазону А , В (рис. 3.2.).

Рис. 3.2. Диапазон значений интервала А-В

Искомое условие: (x>A && x<B).

В этом случае используется логическая связка "И", которая проверяет одновременное выполнение двух условий. В самом деле, х попадает в заданный диапазон, когда выполняются оба условия (и первое, и второе).

Пример: Записать условие когда переменная x не принадлежит диапазону А , В (рис. 3.3.).

Рис. 3.3. Значения, не входящие в диапазон А-В

Искомое условие: (x<A || x>B).

Вэтом случае используется логическая связка "ИЛИ", которая проверяет выполнение хотя бы одного условия. В этом случае, х попадает в заданный диапазон, когда выполняется одно из двух условий (или первое, или второе).

Влогической связке "ИЛИ" не всегда вычисляются оба операнда, если первое из логических выражений дает в результате TRUE, то второе выражение не вычисляется, поскольку уже никак не может повлиять на общий результат вычислений.

Влогической связке "И" всегда вычисляются оба операнда, так как каждый из них влияет на результат.

Если арифметические операции в выражении можно сравнить с утверждением некоторого факта. Например, х=5 (икс равняется пяти это утверждение), то логическое выражение и операции отношения можно сравнить с постановкой некоторого вопроса.

Например:

 

(А==В)

Равны ли переменные А и В?

( А > В)

Какая переменная больше?

(А>B)&&(A>C)

Выполняется ли это условие?

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Неудивительно, что ответом на вопрос может быть только "да" или "нет", TRUE или FALSE (0 или 1).

3.7. Поразрядные (побитовые) операции

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

До сих пор мы рассматривали значение переменной без связи с её внутренним представлением, но

некоторые задачи требуют понимания происходящих на машинном уровне процессов обработки информации. Например, управление оборудованием (клавиатурой или принтером) заключается в анализе и изменении отдельных битов регистра управления. Подобным задачам необходимо работать с отдельными битами переменной, для этой цели в языках программирования применяют побитовые операции.

Побитовые операции используются для анализа и изменения отдельных битов числа и применяются только к переменным целого типа: int, char и их вариантам (long int, unsigned char и тому подобное). Побитовые операции нельзя применять к переменным типа: float, double, void, а также к более сложным типам данных.

Отдельные биты переменной можно рассматривать как логические значения, поскольку они могут принимать лишь два значения 0 или 1, которые в языке С можно рассматривать как TRUE и FALSE.

Кпобитовым операциям относятся:

~отрицание (или инверсия); & логическое И; | логическое ИЛИ;

^исключающее ИЛИ ( XOR, отрицание равенства).

Побитовых операций бинарные, то есть оперируют в думя операндами, поскольку по своей природе они являются логическими, то могут быть заданы с помощью таблиц истинности (таблица 3.2.). В данном

случае под x и y следует понимать отдельные биты переменных x и y.

Таблица 3.2

x

y

(x & y)

(x | y)

(x ^ y)

(~x)

 

 

 

 

 

 

0

0

0

0

0

1

 

 

 

 

 

 

0

1

0

1

1

1

 

 

 

 

 

 

 

 

 

 

 

 

1

0

0

1

1

0

 

 

 

 

 

 

1

1

1

1

0

0

 

 

 

 

 

 

 

 

 

 

 

 

Например, если n-ый бит переменной x равен 0, и n-ый бит переменной y равен 1, то n-ый бит (x ^ y) равен 1, а n-ый бит (x & y) равен 0.

Для полноценной работы с отдельными битами переменной необходимо три функции:

установка бита (запись 1);

сброс бита (запись 0);

проверка бита.

Рассмотрим некоторые приёмы работы с отдельными битами переменной. В каждой операции участвуют два операнда:

Первый операнд это переменная, хранящая информацию.

Второй операнд это маска, отмечающая биты, участвующие в операции.

Для того чтобы "пометить" бит необходимо в соответствующем разряде маски записать 1, например, число 128 = 27 "помечает" 7-ой бит (единица в седьмом разряде).

Двоичное представление числа 128: …000000010000000

В следующих примерах: действия проводятся с переменной i, второй операнд это маска.

i & 1;

// проверка i на четность

i | 128;

// установить 1 в 7-ом бите i

i ^ 8;

// инвертировать 3-ий бит i

~i;

// инвертировать все биты числа i

Операция & часто используется для маскирования некоторого множества битов, например: int C,N;

С=N & 0377;

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]