![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Операция приведения типа
В любом выражении преобразование типов может быть u1086 осуществлено явно, для этого достаточно перед выражением поставить в скобках идентификатор соответствующего типа. Вид записи операции: (тип) выражение; ее результат - значение выражения, преобразованное к заданному типу. Операция приведения типа вынуждает компилятор выполнить указанное преобразование, но ответственность за последствия возлагается на программиста. Рекомендуется использовать эту операцию в исключительных случаях, например: float x; int n =6, k =4; x =(n+k)/3; → x =3, т.к. дробная часть будет отброшена; x =(float)(n+k)/3; → x=3.333333 - использование операции приведения типа позволяет избежать округления результата деления целочисленных операндов. == - равно или эквивалентно; ! = - не равно; < - меньше; < = - меньше либо равно; > - больше; > = - больше либо равно. Пары символов соответствующих операций разделять нельзя. Общий вид операций отношений: < выражение 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 четно! "); Комбинирование операций над битами с арифметическими операциями часто позволяет упростить выражения. Операция «,» (запятая) Данная операция используется при организации строго гарантированной последовательности вычисления выражений (используется там, где по синтаксису допустима только одна операция, а нам необходимо разместить две и более, например, в операторе for). Форма записи: выражение 1, …, выражение N; выражения 1, …, N вычисляются последовательно и результатом операции становится значение выражения N, например: m =(i =1, j =i ++, k =6, n =i+j+k); получим последовательность вычислений: i =1, j =i =1, i =2, k=6, n=2+1+6, и в результате m=n=9.
|