Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операции отношения и логические операции

Поиск
Операциями отношения являются => > =< < все они имеют одинаковое старшинство. Непосредственно за ни-ми по уровню старшинства следуют операции равенства и нера-венства: ==!= которые тоже имеют одинаковое старшинство. операции отноше-ния младше арифметических операций, так что выражения типаI Упражнение 2-1 --------------- Напишите оператор цикла, эквивалентный приведенному вышеоператору FOR, не используя операции &&.

2.7. Преобразование типов

Если в выражениях встречаются операнды различных типов,то они преобразуются к общему типу в соответствии с неболь-шим набором правил. В общем, автоматически производятсятолько преобразования, имеющие смысл, такие как, например,преобразование целого в плавающее в выражениях типа F+I. Вы-ражения же, лишенные смысла, такие как использование пере-менной типа FLOAT в качестве индекса, запрещены. Во-первых, типы CHAR и INT могут свободно смешиваться варифметических выражениях: каждая переменная типа CHAR авто-матически преобразуется в INT. Это обеспечивает значительнуюгибкость при проведении определенных преобразований симво-лов. Примером может служить функция ATOI, которая ставит всоответствие строке цифр ее численный эквивалент. ATOI(S) /* CONVERT S TO INTEGER */ CHAR S[]; { INT I, N; N = 0; FOR (I = 0; S[I]>='0' && S[I]<='9'; ++I) N = 10 * N + S[I] - '0'; RETURN(N); } KAK Уже обсуждалось в главе 1, выражение S[I] - '0' имеет численное значение находящегося в S[I] символа, потомучто значение символов '0', '1' и т.д. образуют возрастающуюпоследовательность расположенных подряд целых положительныхчисел. Другой пример преобразования CHAR в INT дает функцияLOWER, преобразующая данную прописную букву в строчную. Есливыступающий в качестве аргумента символ не является пропис-ной буквой, то LOWER возвращает его неизменным. Приводимаяниже программа справедлива только для набора символов ASCII. LOWER(C) /* CONVERT C TO LOWER CASE; ASCII ONLY */INT C;{ IF (C >= 'A' && C <= 'Z') RETURN(C + '@' - 'A'); ELSE /*@ Записано вместо 'A' строчного*/ RETURN(C);} Эта функция правильно работает при коде ASCII, потому чточисленные значения, соответствующие в этом коде прописным истрочным буквам, отличаются на постоянную величину, а каждыйалфавит является сплошным - между а и Z нет ничего, кромебукв. Это последнее замечание для набора символов EBCDICсистем IBM 360/370 оказывается несправедливым, в силу чегоэта программа на таких системах работает неправильно - онапреобразует не только буквы. При преобразовании символьных переменных в целые возни-кает один тонкий момент. Дело в том, что сам язык не указы-вает, должны ли переменным типа CHAR соответствовать числен-ные значения со знаком или без знака. Может ли при преобра-зовании CHAR в INT получиться отрицательное целое? К сожале-нию, ответ на этот вопрос меняется от машины к машине, отра-жая расхождения в их архитектуре. На некоторых машинах(PDP-11, например) переменная типа CHAR, крайний левый биткоторой содержит 1, преобразуется в отрицательное целое("знаковое расширение"). На других машинах такое преобразо-вание сопровождается добавлением нулей с левого края, в ре-зультате чего всегда получается положительное число. Определение языка "C" гарантирует, что любой символ изстандартного набора символов машины никогда не даст отрица-тельного числа, так что эти символы можно свободно использо-вать в выражениях как положительные величины. Но произволь-ные комбинации двоичных знаков, хранящиеся как символьныепеременные на некоторых машинах, могут дать отрицательныезначения, а на других положительные. Наиболее типичным примером возникновения такой ситуацииявляется сучай, когда значение 1 используется в качествеEOF. Рассмотрим программу CHAR C; C = GETCHAR(); IF (C == EOF)... На машине, которая не осуществляет знакового расширения,переменная 'с' всегда положительна, поскольку она описанакак CHAR, а так как EOF отрицательно, то условие никогда невыполняется. Чтобы избежать такой ситуации, мы всегда пре-дусмотрительно использовали INT вместо CHAR для любой пере-менной, получающей значение от GETCHAR. Основная же причина использования INT вместо CHAR несвязана с каким-либо вопросом о возможном знаковом расшире-нии. просто функция GETCHAR должна передавать все возможныесимволы (чтобы ее можно было использовать для произвольноговвода) и, кроме того, отличающееся значение EOF. Следова-тельно значение EOF не может быть представлено как CHAR, адолжно храниться как INT. Другой полезной формой автоматического преобразованиятипов является то, что выражения отношения, подобные I>J, илогические выражения, связанные операциями && и \!\!, по оп-ределению имеют значение 1, если они истинны, и 0, если ониложны. Таким образом, присваивание ISDIGIT = C >= '0' && C <= '9'; полагает ISDIGIT равным 1, если с - цифра, и равным 0 в про-тивном случае. (В проверочной части операторов IF, WHILE,FOR и т.д. "Истинно" просто означает "не нуль"). Неявные арифметические преобразования работают в основ-ном, как и ожидается. В общих чертах, если операция типа +или *, которая связывает два операнда (бинарная операция),имеет операнды разных типов, то перед выполнением операции"низший" тип преобразуется к "высшему" и получается резуль-тат "высшего" типа. Более точно, к каждой арифметическойоперации применяется следующая последовательность правилпреобразования. - Типы CHAR и SHORT преобразуются в INT, а FLOAT вDOUBLE. - Затем, если один из операндов имеет тип DOUBLE, тодругой преобразуется в DOUBLE, и результат имеет тип DOUBLE. - В противном случае, если один из операндов имеет типLONG, то другой преобразуется в LONG, и результат имеет типLONG. - В противном случае, если один из операндов имеет типUNSIGNED, то другой преобразуется в UNSIGNED и результатимеет тип UNSIGNED. - В противном случае операнды должны быть типа INT, ирезультат имеет тип INT.Подчеркнем, что все переменные типа FLOAT в выражениях пре-образуются в DOUBLE; в "C" вся плавающая арифметика выполня-ется с двойной точностью. Преобразования возникают и при присваиваниях; значениеправой части преобразуется к типу левой, который и являетсятипом результата. Символьные переменные преобразуются в це-лые либо со знаковым расширением,либо без него, как описановыше. Обратное преобразование INT в CHAR ведет себя хорошо -лишние биты высокого порядка просто отбрасываются. Таким об-разом INT I;CHAR C; I = C;C = I; значение 'с' не изменяется. Это верно независимо от того,вовлекается ли знаковое расширение или нет. Если х типа FLOAT, а I типа INT, то как х = I;так и I = х; приводят к преобразованиям; при этом FLOAT преобразуется вINT отбрасыванием дробной части. Тип DOUBLE преобразуется воFLOAT округлением. Длинные целые преобразуются в более ко-роткие целые и в переменные типа CHAR посредством отбрасыва-ния лишних битов высокого порядка. Так как аргумент функции является выражением, то при пе-редаче функциям аргументов также происходит преобразованиетипов: в частности, CHAR и SHORT становятся INT, а FLOATстановится DOUBLE. Именно поэтому мы описывали аргументыфункций как INT и DOUBLE даже тогда, когда обращались к нимс переменными типа CHAR и FLOAT. Наконец, в любом выражении может быть осуществлено("принуждено") явное преобразование типа с помощью конструк-ции, называемой перевод (CAST). В этой конструкции, имеющейвид (имя типа) выражение Выражение преобразуется к указанному типу по правилампреобразования, изложенным выше. Фактически точный смыслоперации перевода можно описать следующим образом: выражениекак бы присваивается некоторой переменной указанного типа,которая затем используется вместо всей конструкции. Напри-мер, библиотечная процедура SQRT ожидает аргумента типаDOUBLE и выдаст бессмысленный ответ, если к ней по небреж-ности обратятся с чем-нибудь иным. таким образом, если N -целое, то выражение SQRT((DOUBLE) N) до передачи аргумента функции SQRT преобразует N к типуDOUBLE. (Отметим, что операция перевод преобразует значениеN в надлежащий тип; фактическое содержание переменной N приэтом не изменяется). Операция перевода имрация перевода име-ет тот же уровень старшинства, что и другие унарные опера-ции, как указывается в таблице в конце этой главы. Упражнение 2-2 --------------- Составьте программу для функции HTOI(S), которая преоб-разует строку шестнадцатеричных цифр в эквивалентное ей це-лое значение. При этом допустимыми цифрами являются цифры от1 до 9 и буквы от а до F.


Поделиться:


Последнее изменение этой страницы: 2016-08-26; просмотров: 199; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.177.72 (0.005 с.)