Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций1+2.doc
Скачиваний:
29
Добавлен:
27.05.2015
Размер:
143.87 Кб
Скачать

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

Тип данных

Размер, бит

Диапазон значений

unsigned char

8

0 ... 255

char

8

-128 ... 127

enum

16

-32768 ... 32767

unsigned int

16

0 ... 65535

short int (short)

16

-32768 ... 32767

unsigned short

16

0 ... 65535

int

16

-32768 ... 32767

unsigned long

32

0 ... 4294967295

long

32

-2147483648 ... 2147483647

float

32

3.4Е-38 ... 3.4Е+38

double

64

1.7E-308 ... 1.7E+308

long double

80

3.4E-4932 ... 1.1E+4932

Предельные значения целочисленных переменных совпада­ют с предельными значениями соответствующих констант (см. табл. 1). Табл. 3 содержит и предельные значения для тех типов, которые не включены в· табл. 1.

Инициализация переменных. В соответствии с синтакси­сом языка переменные автоматической памяти после определе­ния по умолчанию имеют неопределенные значения. Надеяться на то, что они равны, например, 0, нельзя. Однако переменным можно присваивать начальные значения, явно указывая их в оп­ределениях:

тип имя _ переменной=начальное _значение;

Этот прием назван инициализацией. В отличие от присваи­вания, которое осуществляется в процессе выполнения про­граммы, инициализация выполняется при выделении для переменной участка памяти. Примеры определений с инициали­зацией:

float рi=3.1415, сс=1.2З;

unsigned int year=1997;

Именованные константы. В языке Си, кроме переменных, могут быть определены константы, имеющие фиксированные названия (имена). В качестве имен констант используются про­извольно выбираемые программистом идентификаторы, не сов­падающие с ключевыми словами и с другими именами объектов. Традиционно принято, что для обозначений констант выбирают идентификаторы из больших букв латинского алфа­вита и символов подчеркивания. Такое соглашение позволяет при просмотре большого текста программы на языке Си легко отличать имена переменных от названий констант.

Первая возможность определения именованных констант была проиллюстрирована в § 1.2. Это перечисляемые константы, вводимые с использованием слу­жебного слова enum.

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

const тип имя_константы=значение_константы;

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

тип - один из типов объектов;

имя_константы ­идентификатор;

значение _константы должно соответствовать ее типу.

Примеры:

const double Е=2.718282;

const long М=99999999;

const F=765;

В последнем определении тип константы не указан, по умол­чанию ей приписывается тип int.

Третью возможность вводить именованные константы обес­печивает препроцессорная директива

#define имя_константы значение_константы

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

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

const double Е=2.718282;

от определения препроцессорной константы с таким же значе­нием

#define EULER 2.718282

состоит внешне в том, что в определении константы Е явно за­дается ее тип, а при препроцессорном определении константы EULER ее тип определяется "внешним видом" значения кон­станты. Например, следующее определение

#define NEXT 'z'

вводит обозначение NEXT ДЛЯ символьной константы 'z'. Это соответствует такому определению:

const char NEXT = 'z';

Однако различия между обычной именованной константой и препроцессорной константой, вводимой директивой #define, гораздо глубже и принципиальнее. До начала компиляции текст программы на языке Си обрабатывается специальным компо­нентом транслятора - препроцессором. Если в тексте встречает­ся директива

#define EULER 2.718282

а ниже ее в тексте используется имя константы EULER, напри­мер, в таком виде:

double mix = EULER;

d = alfa*EULER;

то препроцессор заменит каждое обозначение EULER на ее зна­чение и сформирует такой текст:

double mix = 2.718282;

d = alfa*2.718282;

Далее текст от препроцессора поступает к компилятору, ко­торый уже "и не вспомнит" о существовании имени EULER, ис­пользованного в препроцессорной директиве #define. Конс­танты, определяемые на препроцессорном уровне с помощью директивы #define, очень часто используются для задания раз­меров массивов.

Итак, основное отличие констант, определяемых препроцес­сорными директивами #define, состоит в том, что эти константы вводятся в текст программы до этапа ее компиляции. Специаль­ный компонент транслятора - препроцессор обрабатывает ис­ходный текст программы, подготовленный программистом, и делает в этом тексте замены и подстановки. Пусть в исходном тексте встречается директива:

#define ZERO 0.0

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

Рисунок 1.1 иллюстрирует некоторые принципы работы препроцессора. Его основное отличие от других компонентов трансля­тора - обработка программы выполняется только на уровне ее текста. На входе препроцессора - текст с препроцессорными директивами, на выходе препроцессора - модифицированный текст без препроцессорных директив. Этот выходной модифи­цированный текст изменен по сравнению с входным текстом за счет выполнения препроцессорных директив, но сами препро­цессорные директивы в выходном тексте отсутствуют. Полно­стью все препроцессорные директивы будут рассмотрены позже. В связи с именованными константами здесь рассмат­ривается только одна из возможностей директивы #define ­простая подстановка.

Текст до препроцессора (исходный текст программы):

#define PI 3.141593

#define ZERO 0.0

…….

if (r>ZERO)/* Сравнение с константой ZERO * / /* Длина окружности радиуса r:*/

D=2*PI*r;

……..