Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты информатика.rtf
Скачиваний:
39
Добавлен:
02.05.2015
Размер:
6.9 Mб
Скачать

[Править]Встроенные функции компилятора

Некоторые компиляторы (например, GCC[1]) поддерживают внутренние версии множества функций Стандартной библиотеки языка Си; то есть, реализации функций записываются в компилируемый объектный модуль, а программа вызывает внутренние версии вместо функций общей библиотеки Си. Это уменьшает накладные расходы при вызове функции, особенно если вызов функции заменяется встроенными вариантами, и разрешается использование других форм оптимизации (если компилятор поддерживает управление характеристиками внутренних вариантов), но может приводить к проблемами при отладке (например, внутренние версии не могут быть заменены инструментальными версиями для проверки).

26.  2. Пользовательские типы данных в языке Си.     В языке Си существует пять способов создания пользовательских типов данных. Пользовательские типы данных можно создавать с помощью:     1) Структуры - группы переменных,имеющей одно имя и называемой агрегатным типом данных. Кроме того, еще известны термины: соединение или конгломерат.    2) Объединения, которое позволяет определять один и тот же участок памяти как два и более типов переменных.    3) Битового поля, которое является специальным типом элемента структуры или объединения, позволяющим легко получать доступ к отдельным блокам.    4) Перечисления - списка поименованных целых констант.    5) Ключевого слова typedef, которое определяет новое имя для существующего типа.     3. Структуры в языке Си.     Структура - это совокупность переменных, объединенных под одним именем. С помощью структур удобно размещать в смежных полях связанные между собой элементы информации. Объявление структур создает шаблон, который можно использовать для создания ее объектов, то есть экземпляров этой структуры. Переменные, из которых состоит структура, называются членами. Члены структуры еще называют элементами или полями.     Как правило, члены структуры связаны друг с другом. Например, элемент списка рассылки, состоящий из имении адреса, логично представить в виде структуры. В объявлении структуры используется ключевое слово struct. Оно сообщает компьютеру, что объявляется (декларируется) структура.    struct addr   {   char name[30];   char street[40];   char city[20];   char state[3];   unsigned long int zip;   };    Обратите внимание на то, что объявление завершается точкой с запятой. Это потому, что объявление структуры является оператором. Кроме того, тег структуры addr идентифицирует эту конкретную структуру данных и является спецификатором ее типа.     В данном случае на самом деле никакая переменная не создается. Всего лишь определяется вид данных. Когда Вы объявляете структуру, то определяете агрегатный тип, а не переменную. И пока Вы не объявите переменную этого типа, то существовать она не будет. Чтобы объявить переменную типа addr, то есть физический объект, необходимо написать следующее:    struct addr addr_info;     В этом операторе объявлена переменная типа addr, которая называется addr_info. Таким образом, addr описывает вид структуры (ее тип), а addr_info является экземпляром (объектом) этой структуры. Когда объявляется переменная-структура, компилятор автоматически выделяет количество памяти, достаточное для того, чтобы разместитьвсе ее члены. На рисунке показано, как addr_info размещена в памяти. В данном случае предполагается, что целые переменные типа long занимают по 4 байта.      Одновременно с объявлением структуры можно объявить одну или несколько переменных. Например,    struct addr {   char name[30];   char street[40];   char city[20];   char state[3];   unsigned long int zip;   } addr_info, binfo, cinfo;     определяет тип структуры, называемый addr, и объявляетпеременный этого типа addr_info, binfo, cinfo. Важно понимать, что каждая переменная-структура содержит собственные копиичленов структуры. Например, поле zip в binfo отличается от поля zip в cinfo. Изменения zip в binfo не повлияют на содержимое поля zip в cinfo.     Если нужна только одна переменная-структура, то тег структуры является лишним. В этом случае наш пример объявления можно переписать следующим образом:    struct {   char name[30];   char street[40];   char city[20];   char state[3];   unsigned long int zip;   } addr_info;     В этом случае объявляется одна переменная с именем addr_info, причем ее поля указаны в структуре, которая предшествует этому имени.     Общий вид объявления структуры такой:    struct тег {   тип имя-члена;   тип имя-члена;   тип имя-члена;   тип имя-члена;   тип имя-члена;   ...   } переменный-структуры    Причем, тег или переменные-структуры могут быть пропущены, но только не оба одновременно. 

27.

Объединения ( union ) | Перечислимый тип данных ( enum )

   Объединения( union )

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

объявление

Все то же самое, как и объявление структуры, только вместо специального слова struct используетсяunion. Вот пример:

union chislo {   int a;   float b;};

Разрешенные операции:

  1. можно присваивать объединения друг другу

  2. адрес брать так же ни кто не запрещал

  3. к элементам можно получить доступ, так же как и в структурах, т.е. через (.) или (->)

Объединение ( union ) можно инициализировать только один значением, причем оно должно соответствовать первому элементу этого объединения. В нашем случае:

union chislo A = {34 }; // пойдетunion chislo B = {34.56 }; // нельзя

У нас первым элементом расположено поле int, поэтому при инициализации так же должно быть поле int.

   Перечислимый тип данных ( enum )

В языке Си существует еще один пользовательский тип данных - перечислимое. Для того, что бы объявитьперечислимый тип данных, необходимо написать специальное слово: enum, далее пишется имя нашего перечисляемого типа данных и все его значения, которые мы сами напишем. Вот примеры:

enum bool { 0 ,1 }; enum names {"Sergey", "Andrey", "Victor"};

Неслучайно подтема называется: перечислимый тип данных (enum), так как наши перечислимые и являются значениями, которые мы не можем менять. Список всех значений принято называть перечисляемым спискомТак как перечислимые по своей сути являются константами, то советую писать имена перечислимых в верхнем регистре.Не забывайте, что структуры, объединения ( union ), перечислимый тип данных ( enum ) нужно объявлять до их инициализации. А то многие объявляют структуру ниже функции main(), а после не поймут в чем же ошибка.В конце урока давайте все же пойме для чего нам нужно создавать пользовательские типы? Ответ кроется всего-навсего в удобстве. Вот их преимущества:

  1. экономия кода

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

  1. удобство понимания кода

структура дает логическое обоснование созданной переменной, что гораздо облегчает понимание кода

  1. легкость в обращении

и передачу в функцию, и запись в файл - все это становится в разы проще и понятнее.

28-31 мы не проходим для экзамена.