Комментарии к коду.
Примечание:В некоторых случаях вместо -1 может получиться другой результат (8191). Появление этого значения объясняется тем, что на некоторых компьютерах при операции сдвига знак числа может не сохраниться. Не все трансляторы языка C гарантируют, что операция сдвига арифметически корректна, поэтому в любом случае более ясным способом деления на 8 было бы явное деление y=y/8.
Объединения. Объединения в языке C подобны структурам, однако в каждый момент времени может использоваться (является активным) только один из его компонентов. Шаблон объединения может задаваться записью вида:
Поля структуры размещаются в оперативной памяти одно за другим в той последовательности, в которой перечислены в описании. В отличие же от структуры, все атрибуты объединения располагаются по одному адресу. Таким образом, под объединение выделяется столько памяти, сколько нужно для хранения наибольшего его атрибута. Доступ к компонентам объединения осуществляется тем же способом, что и к компонентам структур. Пример.
В качестве более осмысленного примера объекта типа union рассмотрим объединение geom_fig[1]:
В этом примере обрабатывается только активный компонент, то есть компонент, который последним получает свое значение. Например, после присваивания значения компоненту radius не имеет смысла обращение к массиву b. Примечание:Обратите внимание на то, что на одних компьютерах поля битов размещаются слева направо, на других - справа налево. Это значит, что при всей полезности работы с ними, если формат данных, с которыми мы имеем дело, дан нам свыше, то необходимо самым тщательным образом исследовать порядок расположения полей; программы, зависящие от такого рода вещей, не переносимы. Выводы Объединения применяются для:
Таким образом, после задания рассмотренной структуры данных в программе будет находиться переменная, которая на законных основаниях может хранить "в себе" значения нескольких типов.
Битовые поля. В прошлом уроке мы с Вами рассматривали понятие структуры. Полями структур могут быть не только переменные, но и другие образования, в частности, поля битов. Хотя правила языка не имеют ограничений на характер этих полей, кроме требования, чтобы они помещались в объеме машинного слова, в типичных применениях поля битов служат для хранения целых данных (чаще типа unsigned). Описание поля битов состоит из описания типа поля, его имени и указанного после двоеточия размера поля в битах, например: unsigned status: 6;. Если имя поля опущено, то создается скрытое поле. Если размер поля битов представлен числом 0, то следующее поле битов начнется с границы машинного слова*. Пример.
* Примечание: Машинное слово. - набор из 2-х 4-х или 8-ми последовательных байтов, обрабатываемый аппаратной частью системы как единое целое.
Домашнее задание 1. Написать программу для хранения в битовом поле информации о конфигурации компьютера. Например: Корпус AT – 0, ATX – 1; Видео на борту – 0, карта – 1 и так далее. 2. Написать программу учета сдачи зачетов при помощи битовых полей. Структура содержит поля: фамилия, группа, зачеты (битовое поле). Предусмотреть вывод списков сдавших все зачеты и должников по группам и в алфавитном порядке. 3. Создать битовое поле для хранения времени (часы, минуты, секунды, миллисекунды). Написать функции для установки и получения времени в(из) битовое(-го) поле(-я).
Урок №18.
Препроцессор. Препроцессор - это программа, которая производит некоторые (иногда весьма значительные) манипуляции с первоначальным текстом программы перед тем, как он подвергается компиляции. Будучи дословно переведенным, с английского, слово препроцессор означает предварительный обрабатыватель Препроцессоры создают входной текст для компиляторов и могут выполнять следующие функции:
Например, весьма часто в программах приходится использовать "ничего не говорящие" числа. Это могут быть какие-то математические константы или размеры используемых в программе массивов и т.д. Общепризнано, что обилие таких констант затрудняет понимание программ и считается признаком плохого стиля программирования. В среде программистов такие константы получили язвительное название магических чисел. Чтобы программа не изобиловала ими, языки программирования позволяют дать константе имя и далее использовать его везде вместо самой константы. В языке C такую возможность обеспечивает препроцессор. Например, с помощью определений
препроцессор заменит в программе все имена P1 и E на соответствующие числовые константы. Теперь, когда вы обнаружите, что неправильно написали приближенное значение основания натуральных логарифмов, вам достаточно исправить единственную строку с определением константы, а не просматривать всю программу:
Препроцессор языка C позволяет переопределять не только константы, но и целиком программные конструкции. Например, можно написать определение:
и затем всюду писать бесконечные циклы в виде:
А если вам не нравятся фигурные скобки, то определите
и далее используйте в качестве операторных скобок begin и end, как это делается, например, в языке Pascal. Подобные определения, называемые макроопределениями (макросами), могут иметь параметры (и вследствие этого быть еще более мощными), однако об этом чуть позже. Еще одна важная "услуга" препроцессора - включение в исходный текст содержимого других файлов. Эта возможность в основном используется для того, чтобы снабжать программы какими-то общими для всех файлов определениями. Например, чрезвычайно часто в начале программы на языке C встречается препроцессорная конструкция:
Когда исходный текст программы обрабатывается препроцессором, на место этой инструкции ставится содержимое файла iostream, содержащего макроопределения и объявления данных, необходимых для работы потоков ввода-вывода. Оператор (директива) препроцессора - это одна строка исходного текста, начинающаяся с символа #, за которым следуют название оператора (define, pragma, include, if) и операнды. Операторы препроцессора могут появляться в любом месте программы, и их действие распространяется на весь исходный файл.
©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|