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

Подбельский учебник с++ / Подбельский - главы 10-12

.pdf
Скачиваний:
28
Добавлен:
22.05.2015
Размер:
1.46 Mб
Скачать

476

Язык Си++

ляции программы в режиме EasyWin в среде Windows, вывод окна, аналогичного изображенному на рис. 12.1) и завершение программы. Если такая последовательность действий программиста не устраивает, он может написать собственную функцию (terminate_function) и зарегистрировать ее с помощью функции set_terminate (). В этом случае terminate () будет вызывать эту новую функцию вместо функции abort ().

Функция set_terminate() позволяет установить функцию, определяющую реакцию программы на исключение, для обработки которого нет специальной процедуры. Эти действия определяются в функции, поименованной ниже как terminate_func(). Указанная функция специфицируется как функция типа terminate_function. Такой тип в свою очередь определен в файле except.h как указатель на функцию без параметров, не возвращающую значения:

typedef void (*terminate function) () ; terminate_function set_tarminate(terminate_function

terminate_func);

Функция set_terminate() возвращает указатель на функцию, которая была установлена с помощью set_terminate () ранее.

Следующая программа демонстрирует общую схему применения собственной функции для обработки неопознанного исключения:

//Р12-12.СРР - замена стандартной функции terminate()

#include

<stdlib.h>

// Для

функции

abort()

tinclude

<except.h>

// Для функции поддержки исключений

tinclude

<iostream.h>

// Для

потоков

ввода-вывода

//Указатель на предыдущую функцию terminate: void (*old_tenninate) ();

//Новая функция обработки неопознанного исключения: void new_terminate()

( cout « "\пВызвана функция new_tenninate () " ;

//... Действия, которые необходимо выполнить

//... до завершения программы

abort();

// Завершение программы

void main()

{ // Установка своей функции обработки: old_terminate = set terminate (new_terminate) ;

// Генерация исключения вне контролируемого блока: throw(25);

Глава 12. Обработка о. oooix (исключительных) ситуаций в Си++

477

Результат выполнения программы:

Вызвана функция new_terminate()

Вслед за этим программа завершается и выводит в окно сообщение: "Program Aborted!" (рис. 12.1)

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

Функция void unexpected () вызывается, когда некоторая функция порождает исключение, отсутствующее в списке ее исключений. В свою очередь функция unexpected {) по умолчанию вызывает функцию, зарегистрированную пользователем с помощью set_unexpected(). Если такая функция отсутствует, unexpected() вызывает terminate (). Функция unexpected() не возвращает значения, однако может сама порождать исключения.

Функция sat_unexpected() позволяет установить функцию, определяющую реакцию программы на неизвестное исключение. Эти действия определяются в функции, которая ниже поименована как unexpected_func (). Указанная функция специфицируется как функция типа unexpected_function. Этот тип определен в файле except.h как указатель на функцию без параметров, не возвращающую значения:

typedef void (*unexpected_function)(); unexpected_function set__unexpected(unexpected_function

unexpected_func);

По умолчанию, неожиданное (неизвестное для функции) исключение вызывает функцию unexpected (), которая, в свою очередь вызывает либо unexpected_func () (если она определена), либо terminate () (в противном случае).

Функция set_unexpected () возвращает указатель на функцию, которая была установлена с помощью set_unexpected() ранее. Устанавливаемая функция (unexpected_func) обработки неизвестного исключения не должна возвращать управление вызвавшей ее функции unexpected(). Попытка возврата приведет к неопределенным результатам.

478

Язык Си++

Кроме всего прочего, unexpected_funo () может вызывать функции abort(),exit() И terminate().

Глобальные переменные, относящиеся к исключениям:

throwExceptionName

содержит имя типа (класса) последнего исключения, порожденного программой;

throwFileName

содержит имя файла с исходным текстом программы, в котором было порождено последнее исключение;

throwLineNumber

содержит номер строки в исходном файле, в которой создано порождение исключения.

Эти переменные определяются в файле except.h следующим образом:

extern

char

*

throwExceptionName;

extern

char

*

throwFileName;

extern

unsigned

throwLineNumber;

 

 

 

 

 

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

//Р12-13.СРР - Использование глобальных переменных // throwExceptionName, throwFileName

//и throwLineNumber

#include <except.h>

// Описание переменных

 

throwXXXX

iinclude <iostream.h>

// Описание потоков ввода-вывода

class A

// Определяем класс А

 

 

{ public:

 

 

 

void print() // Функция печати сведений об исключении { cout « "Обнаружено исключение ";

cout «

 

 

throwExceptionName;

cout «

" в строке " «

 

throwLineNumber;

cout

«

" файла

"' «

_throwFileName « '""

cout

«

endl;

 

 

 

class B: public A {};

// Класс В порождается иэ А

class С: public A {};

// Класс С порождается иэ А

С _с;

 

 

 

 

// Создан объект класса С

void f()

 

 

// Функция может порождать любые исключения

{try

{// Формируем исключение (об'ьект класса С) : throw( с);

Глава 12. Обработка особых (исключительных) ситуаций в Си-»

479

исключения типа В

void main()

{try { f(); } // Контролируемый блок

//Обрабатываются исключения типа А

//(и порожденных от него):

catch (A X)

{ X . p r i n t ( ) ; };

// Обнаружено исключение

Результат выполнения программы:

Обнаружено исключение С в строке 22 файла 'Р12-13.СРР'

Комментарии в тексте программы достаточно подробно описывают ее особенности. В выводимом на экран результате используются значения глобальных переменных. (Обратите внимание, что указанные результаты получаются при компиляции программы с заранее установленными опциями, о которых кратко сказано ниже в п. 12.7.

12.5. Конструкторы и деструкторы в исключениях

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

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

//Р12-14.СРР - вызовы деструкторов при исключении #xnclude <ioatreaa.h> // Описание потоков ввода-вывода

#include

<new.h>

 

//

Описание функции

set_new_handler

•include

<cstring.h>

//

Описание класса

cstring

// Определение класса "блок памяти"

 

class Memory

 

 

 

 

{ char *ptr;

 

 

 

 

public:

 

 

 

 

 

Memory()

// Конструктор выделяет 60 Кбайт памяти

480

 

Язык Си++

{ ptr = new char [61440U];, }

~Memory()

//

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

{ delete ptr;

}

 

}; // Определение класса "Набор блоков памяти":

class BigMemory

 

 

 

 

{ static int nCopy;

// Счетчик экземпляров класса + 1

Memory *MemPtr;

 

//

Указатель на класс Memory

public:

 

 

 

 

// Конструктор с параметром по умолчанию

BigMemory(int n = 3)

 

 

{ cout « endl «

nCopy « ":

";

MemPtr ж new Memory [n];

 

cout « "Успех!";

// Если

память выделена успешно,

++пСору;

//

увеличиваем счетчик числа экземпляров

}

~BigMemory() // Деструктор очищает выделенную память { cout « endl « --nCopy « ": Вызов деструктора";

delete [] MemPtr;

//Инициализация статического элемента: int BigMemory::nCopy = 1;

//Указатель на старый обработчик для new:

void (*old_new_handler) () ; // Новый обработчик ошибок:

void new_new_handler() throw(xalloc) { // Печатаем сообщение...

cout « "Ошибка при выделении памяти!";

// ... и передаем управление старому обработчику (*old_new_handler)();

}

void main(void)

( // Устанавливаем новый обработчик: old_new_handler = set_new_handler(new_new_handler) try // Контролируемый блок

{ // Запрашиваем 100 блоков по 60 Кбайт: BigMemory Requestl(100);

//Запрашиваем 100 блоков по 60 Кбайт: BigMemory Request2(100) ;

//Запрашиваем 100 блоков по 60 Кбайт: BigMemory Requests(100) ;

)

 

 

 

catch (xmsgi X)

// Передача объекта по ссылке

{

cout « "ХпОбнаружено исключение " « X.whyO

 

cout « "

класса " «

throwExceptionName;

Глава 12. Обработка особых (исключительных) ситуаций в Си++

aet_new_handler (old_new__handler) ;

Результат выполнения программы:

1:Успех!

2:Успех!

3:Ошибка при выделении памяти!

2:Вызов деструктора

1: Вызов деструктора

Обнаружено исключение Out of Memory класса xalloc

Заметим, что обычно вызовы деструкторов происходят по умолчанию. Однако эти умалчиваемые вызовы можно отменить с помощью опции компилятора -xd (см. ниже п. 12.7). В этом случае результат выполнения программы будет таким:

1:Успех!

2:Успех!

3:Обнаружено исключение Out of Memory класса xalloc

12.6. Динамическая идентификация типов (RTTI)

Недавнее добавление в проект стандарта языка Си++ механизма динамической идентификации типов (RTTI - Run-Time Type Identification) расширяет язык набором средств, позволяющих идентифицировать конкретные типы объектов во время выполнения программы, даже если известны только указатель или только ссылка на интересующий вас объект. (Отметим, что для использования средств динамического определения типов к программе необходимо подключить

файл typeinfo.h.)

Механизм динамического определения (идентификации) типов позволяет проверить, является ли некоторый объект объектом заданного типа, а также сравнивать типы двух данных объектов . Для этого используется операция typeid, которая определяет тип аргумента и возвращает ссылку на объект типа const typeinfo, описывающий этот тип. В качестве аргумента typeid можно также использовать и имя некоторого типа. В этом случае typeid вернет ссылку на объект const typeinfo этого типа. Класс typeinfo содержит операции-функции oparator= и operator !=, которые используются для сравнении типов объектов. Класс typeinfo также содержит компонентную функ-

31-2432

482 Язык Си++

цию name(), возвращающую указатель на строку, содержащую имя типа аргумента.

Операция typeid имеет две формы:

typeid (выражение) typeid (имя типа)

Эта операция используется для динамического получения информации о типах данных, typeid возвращает ссылку на объект типа const typeinfo. Возвращаемый объект представляет тип операнда оператора typeid.

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

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

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

Класс typeinfo описан в файле typeinfo.h (если не считать некоторых опущенных нами модификаторов, не влияющих на существо дела) следующим образом:

class rtti typeinfo { public:

tpid * tpp; private:

typeinfo(const typeinfo &);

typeinfo & operator=(const typeinfo 6); public:

virtual ~typeinfo();

int operator»»(const typeinfo S) const; int operator!=(const typeinfo 4) const; int before(const typeinfo 4) const; const char * name() const;

};

Общедоступная компонентная функция name О возвращает указатель на строку, определяющую тип операнда typeid. Конкретная длина

возвращаемой строки может изменяться при каждом новом вызове функции.

Компонентная функция before () производит лексикографическое сравнение названий (имен) типов двух заданных объектов. Для этого необходимо использовать следующую конструкцию:

typeid(Tl).before(typeid(Т2));

Если имя типа Т1 "предшествует" имени типа Т2, то функция возвращает I, в противном случае возвращается 0.

Рассмотрим следующий вариант программы:

//Р12-15.СРР - идентификация и сравнение типов объектов finclude <typeinfo.h>

#include <iostream.h> void main()

( char szString[10]; float floatVar;

cout « typeid(szString).name() « ", " « typeid(floatVar).named;

cout « endl «

typeid .szString).before(typeid(floatVar));

Результат выполнения программы:

char *, float 1

В первой строке результата в текстовом виде напечатаны названия типов переменных szString и floatVar, а во второй строке - результат выполнения функции before(). Он равен I. Это означает, что строка "char *" лексикографически предшествует строке "float", что соответствует латинскому алфавиту.

Операции-функции o p e r a t o r = ( ) и operator! = () обеспечивают сравнение двух типов данных.

Пусть szString и floatVar описаны так, как в предыдущем примере, тогда

•typeid(szString)=typeid(floatVar). // Условие

// HE выполнено

.typeid(szString)!=typeid(floatVar). // Условие

// выполнено

Ключевое слово r t t i и опция -RT. ПО умолчанию в Borland C+ + динамическое определение типов (RTTI) всегда разрешено. Од-

484

Язык Си++

нако его можно разрешать или запрещать, используя ключ -RT (подробнее см. ниже п. 12.7). Если RTTI запрещено или аргументом typeid является указатель или ссылка на класс без виртуальных функций, typeid возвращает ссылку на объект const typeinfo, описывающий объявленный тип указателя или ссылки, но не реальный объект (т.е. указатель или ссылку на него).

Если при компиляции использовать ключ -RT- (то-есть отключить динамическое определение типов) и некоторый базовый класс объявлен rtty, то все полиморфные базовые классы также должны быть объявлены как rtti.

struct rtti { virtual si О; } ;

// Полиморфизм

 

 

 

// Полиморфизм

struct __rtti { virtual a2(); );

struct X: SI, S2 {);

 

Если отключен механизм RTTI (использован ключ -RT-), то динамическое определение типов в порожденных классах может оказаться недоступным. При множественном наследовании способность к динамической идентификации типов порожденного класса зависит от типов и порядка следования базовых классов. Порядок следования оказывается важным в случае, если новый класс порождается как классами без виртуальных функций, так и классами с виртуальными функциями.

Если компилировать указанные ниже строки с ключом -RT-, вы должны объявить х с модификатором r t t i . В противном случае

изменение порядка следования базовых классов для х вызовет ошибку прикомпиляции:

Can't i n h e r i t поп RTTI c l a s s from RTTI base ' S I '

(Невозможно наследовать He-RTTI-класс из базового RTTI-класса

•si-).

 

struct __rtti SI

// Полиморфный класс

{ virtual func(); } ;

 

struct S2

// Неполиморфный класс

< In-

 

struct _ _rtti X: SI, S2

 

В данном случае класс х явно объявлен как r t t i . Это сделано как раз для того, чтобы не зависеть от порядка следования базовых классов при описании х.

Глава 12. Обработка особых (исключительных) ситуаций в Си++

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

struct rtti SI { }; // Неполиморфные классы struct S2 { };

struct X: S2, S2 { }; // Порядок следования базовых // классов несущественен

Обратите внимание на то, что применение r t t i или ключа -RT

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

//Р12-16.СРР - динамическая идентификация типов для // полиморфных классов

finclude <iostream.h> #include <typeinfo.h> class rtti Alpha

{ // Alpha и порожденные иэ него - RTTI-классы

virtual void func() {}; );

class В : public Alpha (}, int main(void)

( В Binst; В *Bptr;

Bptr = iBinst; try

//Виртуальная функция делает

//класс Alpha полиморфным //В - тоже RTTI

//Копия класса В

//Указатель на класс В

//Инициализация указателя

{ // Какого типа *Bptr?

if

(typeid(*Bptr)

=

typeid(В))

 

cout « "Тип "

«

typeid(*Bptr).name() «

if

{typeid(*Bptr)

!=

typeid(Alpha))

cout « "ХпУкаэаталь не типа Alpha."; return 0;

)

catch (Bad_typeid)

{ cout « "Ошибка функции typeid()."; return 1;

}

Результат работы программы: Тип в.

Указатель не типа Alpha.

1

486

Язык Си++

12.7. Опции компилятора, относящиеся к обработке исключений и динамическому определению типов (RTTI)

Доступ к установке перечисленных ниже опций можно получить либо с помощью задания ключей компилятору в командной строке, либо из интегрированной среды разработки (IDE) Borland C++ 4.0/4.5, из меню

OptionsIProject|C++ OptionsIException Handling/RTTI

Если вы используете компилятор командной строки, то для того, чтобы установить некоторую опцию, необходимо задать соответствующий ключ, а для того, чтобы ее отменить - тот же ключ, но с последующим символом ' - ' . Например, для задания разрешения поддержки исключений (см. ниже) необходимо запустить компилятор с ключом -х, а для того, чтобы такую поддержку запретить - с ключом

-х-.

Enable Exceptions - Разрешить поддержку исключений

(По умолчанию = ON, т.е. опция включена)

Попытка использования исключений и процедур их обработки без этой опции вызовет появление ошибки при компиляции: "Exception handling not enabled in function ...". Выключение этой опции может быть полезно, например, если вы хотите удалить обработку исключений из вашей программы (скажем, для переноса ее на другую платформу или перехода на другой компилятор).

-хр Enable Exception Location Information - Разрешить получение ин-

формации о месте порождения исключения

(По умолчанию = OFF, т.е. опция отключена)

Эта опция предоставляет возможность получения информации о месте возникновения исключительной ситуации (название файла и номер строки) во время выполнении про-

граммы

(см.

функции

throwFileName

И

 

throwLineNumber).

 

 

 

 

-xd Enable Destructor Cleanup - Разрешить вызов деструкторов

(По умолчанию = ON, т.е. опция включена)

Если эта опция установлена, то в случае порождения исключения для всех объектов, созданных между областями види-

Глава 12. Обработка особых (исключительных) ситуаций в Си++

487

мости операторов catch и throw, происходит вызов соответствующих деструкторов. Заметим, что для динамических объектов автоматического вызова деструкторов не происходит и динамические объекты автоматически не освобождаются.

-xf Enable Fast Exception Prologs - Разрешить генерацию "быстрого"

начального кода

(По умолчанию = OFF, т.е. опция отключена)

Эта опция указывает компилятору, что необходимо осуществить подстановку /л///1£-выражений во все функции обработки исключений. Это повышает надежность программы, но увеличивает ее размер (размер получающегося .ЕХЕ-модуля). Заметим, что выбор этой опции возможен лишь при отключенной опции Enable Compatible Exception.

-хс Enable Compatible Exceptions - Разрешить совместимость исключе-

ний

(По умолчанию = OFF, т.е. опция отключена)

Эта опция позволяет создавать с помощью Borland C++ .ЕХЕ и .DLL модули, совместимые с .ЕХЕ-модулями, созданными другими программами. Если вы установите эту опцию, то в исполняемый (.ЕХЕ) файл будет включена некоторая информация, касающаяся обработки исключений (даже при выключенной опции Enable Exceptions).

-RT Enable Runtime Type Information

Разрешить динамическое полу-

чение информации о типах объектов

 

(По умолчанию = ON, т.е. опция включена)

Указание этой опции сообщает компилятору о необходимости построения кода, позволяющего производить определение типов объектов во время исполнения программы. Если вы используете ключ -xd, то вам необходимо, как правило, указывать и эту опцию, поскольку в противном случае вы не сможете удалить указатель на класс с виртуальным деструктором. Поэтому обычно эта опция используется одновременно с опцией -xd {Enable Destructor Cleanup).

ПРИЛОЖЕНИЕ 1

ТАБЛИЦЫ КОДОВ ASCII

Таблица П1.1

Коды управляющих символов (0 н- 31)

Символ

Код 10

Код 08

Код 16

n u l

0

0

00

s o h

1

1

01

s t x

2

2

02

e t x

3

3

03

e o t

4

4

04

e nq

5

5

05

a ck

6

6

06

b e l

7

7

07

b s

8

10

08

h t

9

11

09

I f

10

12

v t

11

13

ОВ

f f

12

14

ОС

c r

13

15

0D

s o

14

16

s i

15

17

0F

d i e

16

20

10

d e l

17

21

11

d c 2

18

22

12

d c 3

19

23

13

d c4

20

24

14

nalc

21

25

15

s y n

22

26

16

e t b

23

27

17

c a n

24

30

18

em

25

31

19

sub

26

32

e s c

27

33

IB

f s

28

34

g s

29

35

ID

r s

30

36

IE

u s

31

37

IF

Клавиши Значение

A8

Нуль

AA

Начало заголовка

АВ Начало текста

АС Конец текста

A D

Конец передачи

А Е

Запрос

А р

Подтверждение

AG

Сигнал (звонок)

ЛН

Забой (шаг назад)

А1 Горизонтальная табуляция A J Перевод строки

АК Вертикальная табуляция

A L

Новая страница

АМ

Возврат каретки

A N

Выключить сдвиг

А О

Включить сдвиг

А р

Ключ связи данных

 

A Q

Управление устройством 1

A R

Управление устройством 2

A S

Управление устройством 3

A m

Управление устройством 4

A U

Отрицательное подтверждение

A V

Синхронизация

A W

Конец передаваемого блока

Ax

Отказ

A y

Конец среды

 

Az

Замена

A [

Ключ

A \

Разделитель файлов

A ]

Разделитель группы

A A

Разделитель записей

A

Разделитель модулей

В графе "клавиши" обозначение А соответствует нажатию клавиши Ctrl, вместе с которой нажимается соответствующая "буквенная клавиша, формируя код символа.

Приложение1.ТаблицыкодовASCII

Таблица П1.2

Символы с кодами 32 + 127

Символ

Код 10

Код 08 | Код 16

пробел

32

40

20

 

33

41

21

 

34

42

22

 

35

43

23

 

36

44

24

 

37

45

25

 

38

46

26

 

39

47

27

 

40

50

28

 

41

51

29

 

42

52

 

43

53

 

44

54

 

45

55

2D

 

46

56

о

47

57

2F

48

60

30

1

49

61

31

2

50

62

32

3

51

63

33

4

52

64

34

5

53

65

35

6

54

66

36

7

55

67

37

8

56

70

38

9

57

71

39

 

58

72

ЗА

 

59

73

зв

 

60

74

зс

 

61

75

3D

 

62

76

ЗЕ

 

63

77

3F

 

64

100

40

 

65

101

41

 

66

102

42

 

67

103

43

 

68

104

44

 

69

105

45

 

70

106

46

 

71

107

47

 

72

ПО

48

1Символ\ Код! 0 | Код 08

Код 16

I

I

73

111

49

1

 

J

 

74

112

 

 

К

75

113

 

 

L

76

114

 

 

М

77

115

4D

 

 

N

78

116

 

 

О

79

117

4F

 

 

Р

80

120

50

 

 

Q

81

121

51

 

 

R

82

122

52

 

 

S

83

123

53

 

 

Т

84

124

54

 

 

и

85

125

55

 

 

V

86

126

56

 

 

W

87

127

57

 

 

X

88

I 130

58

 

 

Y !

89

131

59

 

 

Z

90

132

 

 

1

91

133

 

 

92

134

 

 

\

93

135

5D

 

 

94

136

 

 

—\

95

137

5F

 

Г

96

140

60

 

а*

97

141

61

 

 

Ь

98

142

62

 

 

 

99

143

63

 

 

d

100

144

64

 

 

 

101

145

65

 

 

9М

102

146

66

 

 

103

147

67

 

 

 

104

150

68

 

 

1

105

151

69

 

 

j

106

152

 

 

 

107

153

 

 

1

108

154

 

 

109

 

 

»

НО

155

6D

 

 

156

 

 

Р°

111

157

6F

 

 

112

160

70

 

 

4

113

161

71

 

490

 

 

Язык Си++

 

 

 

 

 

 

 

Таблица П1 2 (продолжение)

Символ

Код 10

Код 08

Код 16

Символ

Код10

Код08

Код 16

г

114

162

72

У

121

171

79

S

115

163

73

z

122

172

t

116

164

74

{

123

173

U

117

165

75

1

124

174

V

118

166

76

)

125

175

7D

W

119

167

77

~

126

176

X

120

170

78

d e l

127

177

7F

 

 

 

 

 

 

Таблица П1.3

Символы с кодами 128 + 255 (Кодовая таблица 866 - MS-DOS)

Символ

Код 10

Код 08

Код 16

Символ

Код10

Код 08

Код 16

А

128

200

80

Б

129

201

81

В

130

202

82

Г

131

203

83

д

132

204

84

Е

133

205

85

X

134

206

86

3

135

207

87

и

136

210

88

й

137

211

89

к

138

212

л

139

213

м

140

214

н

141

215

8D

О

142

216

п

143

217

8F

р

144

220

90

с

145

221

91

т

146

222

92

У

147

223

93

ф

148

224

94

X

149

225

95

ц

150

226

96

ч

15!

227

97

ш

И?

230

98

щ

153

231

99

ъ

154

232

ы

155

233

Ь

156

234

э

157

235

9D

о

158

236

я

159

237

9F

а

160

240

АО

б

161

241

А1

в

162

242

А2

г

163

243

A3

д

164

244

А4

в

165

245

А5

ж

166

246

А6

S

167

247

А7

и

168

250

А8

й

169

251

А9

к

170

252

АА

л

171

253

АВ

м

172

254

АС

н

173

255

AD

о

174

256

АЕ

п

175

257

AF

щ

176

260

ВО

 

177

261

В1

I

178

262

В2

1}

179

263

ВЗ

 

180

264

В4

}

181

265

В5

182

266

В6

1

 

183

267

В7

Приложение 1. Таблицы кодов ASCII

Таблица П1.3 (продолжение)

Симе

=1

=jI

J

J

L

•*•

т

( •

+

Аг

т

=

X

т

т

1

Г

Г

t

J*

г

L •

Код1С1

КодО

Код 16

184

270

В8 |

185

271

В9

186

272

ВА

187

273

вв

188

274

ВС

189

275

BD

190

276

BE

191

277

BF

192

300

СО

193

301

С1

194

302

С2

195

303

СЗ

196

304

С4

197

305

С5

198

306

С6

199

307

С7

200

310

С8

201

311

С9

202

312

СА

203

313

СВ

204

314

СС

205

315

CD

206

316

СЕ

207

317

CF

208

320

D0

209

321

D1

210

322

D2

211

323

D3

212

324

D4

213

325

D5

214

326

D6

215

327

D7

216

330

D8

217

331

D9

218

332

DA

219

333

DB

 

1Симе

Код

Код

Код16

 

ш

220

334

DC

 

1

22

335

DD

 

1

222

336

DE

 

 

223

337

DF

 

Р

224

340

Е0

 

с

225

341

Е1

 

т

226

342

Е2

 

У

227

343

ЕЗ

 

Ф

228

344

Е4

 

 

229

345

Е5

1

Ц

230

346

Е6

 

4

231

347

Е7

 

ш

232

350

Е8

 

Щ

233

351

Е9

 

 

 

 

 

**

234

352

ЕА

1

м

235

353

ЕВ

1

^

236

354

ЕС

 

э

237

355

ED

 

ю

238

356

ЕЕ

 

я

239

357

EF

= или Ё

240

360

F0

± или в

241

361

F1

 

i.

242

362

F2

 

 

243

363

F3

 

\

244

364

F4

 

J

245

365

F5

 

• * "

246

366

F6

 

 

247

367

F7

1

248

370

F8

249

371

F9

 

 

 

250

372

FA

 

V

251

373

FB

1

п

252

374

FC

 

 

 

1

2

253

375

FD

 

 

 

254

376

FE

 

 

255

377

FF

492

Язык Си++

Таблица П1.4

Символы с кодами 128 + 255 (Кодовая таблица 1251 - MS Windows)

Символ

Код10

Код 08

Код 16

Символ

Код 10

Код 08

Код16

Ъ

128

200

80

О

169

251

А9

Г

129

201

81

е

170

252

АА

/

130

202

82

«

171

253

АВ

Г

131

203

83

-

172

254

АС

и

132

204

84

173

255

AD

 

133

205

85

®

174

256

АЕ

t

134

206

86

i

175

257

AF

*

135

207

87

176

260

ВО

D

136

210

88

±

177

261

В1

V.

137

211

89

i

178

262

В2

Л

138

212

1

179

263

ВЗ

<

139

213

г1

180

264

В4

н>

140

214

р

181

265

В5

к

141

215

8D

I

182

266

В6

ъ

142

216

ё

183

267

В7

ц

143

217

8F

184

270

В8

ь

144

220

90

е

185

271

В9

145

221

91

186

272

ВА

 

1

146

222

92

»

187

273

ВВ

 

147

223

93

j

188

274

ВС

II

148

224

94

S

189

275

BD

149

225

95

а

190

276

BE

-

150

226

96

i

191

277

BF

151

227

97

А

192

300

СО

D

152

230

98

Б

193

301

С1

ПС

153

231

99

В

194

302

С2

 

 

 

 

 

 

 

А

154

232

Г

195

303

СЗ

>

155

233

Д

196

304

С4

Ш

156

234

Е

197

305

С5

К

157

235

9D

X

198

306

С6

и

158

236

3

199

307

С7

Ц

159

237

9F

и

200

310

С8

 

160

240

АО

й

201

311

С9

У

161

241

А1

к

202

312

СА

У

162

242

А2

л

203

313

СВ

J

163

243

A3

м

204

314

СС

D

164

244

А4

н

205

315

CD

г1

165

245

А5

о

206

316

СЕ

1

166

246

А6

п

207

317

CF

§

167

247

А7

р

208

320

D0

Ё

168

250

А8

с

209

321

D1

Приложение 1. Таблицы кодов ASCII

Симво

Код10

Код 08

Код16

Т

210

322

D2

У

211

323

D3

ф

212

324

D4

X

213

325

D5

ц

214

326

D6

ч

215

327

D7

ш

216

330

D8

щ

217

331

D9

ъ

218

332

DA

ы

219

333

DB

ь

220

334

DC

э

221

335

DD

ю

222

336

DE

я

223

337

DF

а

224

340

Е0

б

225

341

Е1

в

226

342

Е2

г

227

343

ЕЗ

л

228

344

Е4

в

229

345

Е5

ж

230

346

Е6

S

231

347

Е7

и

232

350

Е8

493

Таблица П1.4 (продолжение)

Символ

Код 10

Код 08

Код 16

ТЛ

233

351

Е9

 

 

 

к

234

352

ЕА

л

235

353

ЕВ

м

236

354

ЕС

н

237

355

ED

о

238

356

ЕЕ

п

239

357

EF

р

240

360

F0

с

241

361

F1

т

242

362

F2

У

243

363

F3

ф

244

364

F4

X

245

365

F5

Ц

246

366

F6

 

 

 

ч

247

367

F7

ш

248

370

F8

Щ

249

371

F9

ы

250

372

FA

251

373

FB

ъ

252

374

FC

э

253

375

FD

о

254

376

FE

я

255

377

FF

ПРИЛОЖЕНИЕ 2

КОНСТАНТЫ ПРЕДЕЛЬНЫХ ЗНАЧЕНИЙ

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

Таблица П2.1

Предельные значения для целочисленных типов - файл l i m i t s . h

Имяконстанты

Стандартное

значение

 

CHAR_BIT

8

SCHAR_MIN

-127

SCHAR MAX

+127

UCHAR MAX

255

CHAR MIN

0

 

SCHAR MIN

CHAR_MAX

UCHAR MAX

 

SCHAR_MAX

MBLENMAX

1

SHRT_MIN

-32767

SHRT_MAX

+32767

USHRT_MAX

65535

INT_MIN

-32767

INT_MAX

+32767

UINT_MAX

65535

Смысл

Число битов в байте

Минимальное значение для signed char Максимальное значение signed char Максимальное значение unsigned char Минимальное значение для char

Максимальное значение для char

Минимальное число байт в многобайтовом символе

Минимальное значение для short Максимальное значение для short Максимальное значение unsigned short Минимальное значение для int Максимальное значение для int Максимальное значения unsigned int

Приложение 2. Константы предельных значений

495

 

 

 

 

 

Таблица П2.1 (продолжение)

Имя константы

Стандартное

Смысл

 

значение

 

 

 

 

 

 

LONG MIN

-2147483647

Минимальное значение для long

 

 

 

 

LONG_MAX

+2147483647

Максимальное значение для long

 

 

 

 

ULONGJMAX

4294967295

Максимальное значение unsigned long

 

 

 

 

В табл. П2.2 префикс FLI_ соответствует типу float; для типа doubleиспользуетсяпрефиксDBL_.

Таблица П2.2

Константы для вещественных типов - файл f l o a t . h

Стан- Имяконстанты дартное Смысл

значение

FLT_RADIX

2

FLTJDIG

6

FLTJ3PSILON

1E-5

FLT_MANT_DIG

 

FLT MAX

1E+37

FLT_MAX_EXP

 

Основание экспоненциального представления, например: 2, 16

Количество верных десятичных цифр

Минимальное х, такое, что 1.0 + х * 1.0

Количество цифр по основанию FLT_RADIX в мантиссе

Максимальное число с плавающей точкой

Максимальное л, такое, что FLT RADIX" - 1 представимо в виде числа типа float

FLT_MAX_1O_EXP

FLTMIN

FXT_MIN_EXP

FLT MIN 10 EXP

38Максимальное целое п, такое, что 10" представимо как float

1E-37

Минимальное нормализованное число с

 

 

плавающей точкой типа float

 

Минимальное п, такое, что 10" представимо

 

в виде нормализованного числа

-37

Минимальное отрицательное целое п, такое,

 

 

что 10" - в области определения чисел типа

 

float