Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика первый курс / Основы С++ / Основные типы данных

.doc
Скачиваний:
73
Добавлен:
27.03.2015
Размер:
82.94 Кб
Скачать

Основные типы данных

Идентификаторы

Идентификатором называется имя объекта программы, которое

ему дает программист.

Идентификатор может содержать латинские буквы обоих регист-

ров (A-Z,a-z), арабские цифры (0-9) и символ подчеркивания (_).

Рекомендуется выбирать имена, несущие смысловую нагрузку, что

способствует более простому уяснению физического смысла введен-

ной переменной. Ввод в состав идентификаторов символов подчерки-

вания повышает наглядность имени, например, my_program_name го-

раздо легче читать, чем myprogramname.

При выборе идентификатора нужно помнить три простых прави-

ла:

1. Первым символом обязательно должна быть буква или

символ подчеркивания.

2. Длина идентификатора не должна превышать 32 символа.

3. Нельзя использовать имена, совпадающие с нижеперечис-

ленными ключевыми (служебными) словами Turbo C.

Одноименные прописные и строчные буквы считаются различными

символами, поэтому совершенно различны следующие имена:

name Name NAME ...

Большинство программистов используют в идентификаторах про-

писные буквы только для обозначения имен констант и макросов,

описание которых часто приводится в header- файлах и поэтому яв-

но не присутствует в тексте программы.

Допустимо использование одинаковых имен в различных облас-

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

Типы переменных и констант

В языке Си любая переменная должна быть явно объявлена пе-

ред ее использованием в программе. Атрибутами объявления являют-

ся класс памяти, тип переменной и ее имя. Допускается при объяв-

лении переменной присваивать ей требуемое численное значение.

Эта процедура называется инициализацией переменной.

Тип переменной однозначно определяет ее длину в байтах и

форму представления численного значения в выделяемых ячейках па-

мяти. Каждой объявленной переменной компилятор отводит необходи-

мое количество смежных байт памяти с конкретным начальным адре-

сом, который используется для доступа к численному значению пе-

ременной.

Достаточно очевидно, что константы (т.е.числа) также должны

различаться по типам, абсолютно идентичным типам переменных. По-

этому при рассмотрении типов мы не будем особо разделять пере-

менные и константы, называя их общим понятием - "данные".

Все типы принято делить на простые и сложные. К простым от-

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

ключевыми словами:

char - символьные;

int - целые;

float - вещественные;

double - вещественные с удвоенной точностью.

Перед ключевыми словами char и int при необходимости можно

записать необязательные модификаторы типа:

signed - знаковый;

unsigned - беззнаковый.

Они указывают компилятору, как следует интерпретировать

старший бит двоичного кода целого числа. По умолчанию всем целым

переменным приписывается модификатор signed.

Символьные данные

────────────────-

Символьная константа представляет собой байт ASCII - кода символа. Для символов, имеющих графическое представление, ее обычно записывают как сам символ, заключенный в апострофы, например:

'a'

Такая запись эквивалентна заданию ASCII-кода символа, точнее - его численного эквивалента. Символы, не имеющие графического представления, записываются, как показано в таблице:

┌────────────┬───────────────┬──────────────────────────┐

│ Символьная │ 16-ричное │ Назначение или управ- │

│ константа │ представление │ ляющее воздействие │

├────────────┼───────────────┼──────────────────────────┤

│ \a │ 0x07 │ Звуковой сигнал │

│ \n │ 0x0A │ Переход на новую строку │

│ \r │ 0x0D │ Возврат к началу строки │

│ \b │ 0x5C │ Возврат на одну позицию │

│ \\ │ │ Обратный слэш │

│ \DDD │ │ Восьмеричный код символа │

│ \xHH │ │ 16-ричный код символа │

│ \0 │ 0x00 │ Нулевой байт (NULL) │

└────────────┴───────────────┴──────────────────────────┘

Символьные переменные описываются с ключевым словом char и занимают ровно один байт памяти. Значением такой переменной обычно является целое число, соответствующее ASCII-коду конкретного символа и лежащее в пределах от -128 до +127. Конечно, только значения от 0 до 127 имеют символьные эквиваленты. Чтобы использовать весь диапазон от 0 до 255, символьную переменную

следует объявить как unsigned.

Символьные переменные считаются в Си принадлежащими к целому типу.

Целые данные

───────────-

Целой переменной типа int компилятор Borland C++ Builder отводит 4

байта памяти. Старший бит по умолчанию считается знаковым (0-положительное число, 1-отрицательное число). Положительные числа хранятся в такой ячейке в прямом коде,т.е. в обычном двоичном представлении числа. Отрицательные числа

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

Строго говоря, язык Си поддерживает три подтипа целых переменных, обозначаемых такими ключевыми словами:

short int - короткий целый;

int - целый;

long int - длинный целый.

Если указано ключевое слово short или long, то слово int можно опустить.

Константы целого типа можно записывать в десятичной, восьмеричной или шестнадцатеричной системах счисления. Признаком 16-ричной записи является наличие символов 0x (или 0X) в качестве первых символов. Если запись константы начинается с нуля, то она трактуется как восьмеричная, и в ней допустимы только цифры 0 - 7. В остальных случаях подразумевается десятичная система.

Вещественные данные

───────────────────

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

- десятичной точки;

- символа e (или E) с последующим показателем степени.

Для описания вещественных переменных используются такие ключевые слова:

float - вещественный с плавающей точкой (устарело);

double - с удвоенной точностью.

Переменной типа double компилятор отводит 8 байт памяти, где ее численное значение хранится в так называемом нормализованном виде. Нормализация состоит в сдвиге значащих бит двоичного кода числа влево или вправо до тех пор, пока целая часть числа не станет равной единице. Разумеется, для сохранения численного значения каждая операция сдвига сопровождается соответствующим изменением двоичного порядка числа.

Но если целая часть нормализованного двоичного числа всегда равна единице, ее можно вообще не хранить в ячейке памяти! Это экономит один "лишний" бит для записи мантиссы, увеличивая точность представления чисел. Конечно, при чтении числа из ячейки памяти такая "неявная единица", естественно, автоматически восстанавливается.

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

Для чисел типа double прибавляется 1023.

Структура ячейки памяти вещественной переменной типа double имеет вид:

8 байт

│<--------------------------------------------------->│

│1 бит 11 бит 52 бита │

┌────┬──────────┬───────----──────────────────────────┐

│знак│ Хар-ка │ Мантисса │

└────┴──────────┴───────----──────────────────────────┘

63 62 52 51 0

В качестве примера рассмотрим запись в такую ячейку числа 15.375:

1111.011 - двоичный код числа.

Сдвигаем десятичную точку влево на три бита:

1.111011 * 2^3 - нормализованное число.

│ ┌───── └──┐

"неявная" │ │ мантисса │ десятичный

единица │ └────────── │ порядок

───────────┘ └──────────

Получим из десятичного порядка характеристику:

3 + 1023 = 1026 или 100 0000 0010 в двоичной записи.

Учитывая, что число положительное, заполняем ячейку памяти:

знак хар-ка м а н т и с с а

┌───┬────────────────┬────────────────────────────────────────────────────────────────────┐

│ 0 │ 100 0000 0010 │ 1110 1100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 │

└───┴────────────────┴────────────────────────────────────────────────────────────────────┘

└─────┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘

4 0 2 E C 0 0 0 0 0 0 0 0 0 0 0

Итак, если "заглянуть" в ячейку памяти, где хранится число

15.375 , то мы "увидим" двоичный код 402EC00000000000h.

Приведем параметры основных типов данных:

Тип

Р Размер в байтах

Диапазон чисел

char

1

от -128 до 127

unsigned char

1

от 0 до 255

bool

1

true, false

short

2

от -32768 до 32767

unsigned short

2

от 0 до 65535

int

4

от -2147483648 до +2147483647

unsigned int

4

от 0 до +4294967295

long

4

от -2147483648 до +2147483647

unsigned long

4

от 0 до +4294967295

double

8

от 1.7Е-308 до 1.7Е+308

long double

10

от 3.4Е-4932 до 3.4Е+4932

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

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

Области действия и видимости переменных

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

Существует пять категорий областей действия:

- блок;

- функция;

- прототип функции;

- файл;

- вся программа.

Пояснение. Блоком называется группа

операторов, заключенная в фигурные

скобки. В частности, блоком является

тело любой функции.

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

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

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

auto - автоматический;

static - статический;

register - регистровый;

extern - внешний.

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

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

Если при описании локальной переменной ей не присвоено никакого численного значения, то до первого явного присваивания ее содержимое произвольно и непредсказуемо. Говорят, что она содержит "мусор".

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

При объявлении любой переменной можно при желании присвоить ей численное значение. Эта процедура носит обобщенное название инициализации переменной.

Переменная класса auto чаще всего инициализируется именно при ее объявлении, например:

double c = 31.5;

Атрибут auto неприменим к идентификаторам объектов, описанных вне функций. Подобные объекты размещаются компилятором в сегменте данных программы и могут иметь класс памяти static или extern.

Указание атрибута static для конкретных объектов программы

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

Если переменная описана вне функций, то ей приписывается класс памяти static по умолчанию.

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

Если переменная описана вне функций, то она видна и доступна, начиная от места ее объявления до конца файла.

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

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

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

вида

extern int var;

- это не создание новой переменной var, а ее объявление как внешней ссылки для компоновщика.

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

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

Несколько забегая вперед, отметим, что при описании функций также указывается один из двух возможных классов памяти – extern или static, причем смысл этих объявлений несколько иной. По умолчанию любой функции приписывается класс памяти extern, что означает ее доступность из любой точки программы. Если же функцию объявить как static, то она будет видна и доступна только в

пределах "своего" файла.

2.2.4. Инициализация переменных

Любая переменная обязана получить численное значение либо

при ее объявлении, либо в процессе работы программы посредством

оператора присваивания.

Все объекты, имеющие классы памяти static или extern, ини-

циализируются однократно во время компиляции. Если им явно не

присвоено численного значения, они автоматически обнуляются.

Объекты классов auto и register инициализируются каждый раз

при входе в блок, в котором они объявлены. Если их численное

значение в данный момент неизвестно, то содержимое соответствую-

щей ячейки памяти в стеке (для auto) или содержимое отведенного

регистра (для register) будет содержать непредсказуемую информа-

цию ("мусор").