Подбельский учебник с++ / Подбельский - главы 10-12
.pdf476 |
Язык Си++ |
ляции программы в режиме 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 |
0А |
v t |
11 |
13 |
ОВ |
f f |
12 |
14 |
ОС |
c r |
13 |
15 |
0D |
s o |
14 |
16 |
0Е |
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 |
1А |
e s c |
27 |
33 |
IB |
f s |
28 |
34 |
1С |
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 |
2А |
|
43 |
53 |
2В |
|
44 |
54 |
2С |
|
45 |
55 |
2D |
|
46 |
56 |
2Е |
о |
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 |
4А |
|
|
|
К |
75 |
113 |
4В |
|
|
L |
76 |
114 |
4С |
|
|
М |
77 |
115 |
4D |
|
|
N |
78 |
116 |
4Е |
|
|
О |
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 |
5А |
|
|
1 |
91 |
133 |
5В |
|
|
92 |
134 |
5С |
|
|
|
\ |
93 |
135 |
5D |
|
|
94 |
136 |
5Е |
|
|
|
—\ |
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 |
6А |
|
|
|
107 |
153 |
6В |
|
|
1 |
108 |
154 |
6С |
|
|
109 |
|
|||
|
» |
НО |
155 |
6D |
|
|
156 |
6Е |
|
||
|
Р° |
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 |
7А |
t |
116 |
164 |
74 |
{ |
123 |
173 |
7В |
U |
117 |
165 |
75 |
1 |
124 |
174 |
7С |
V |
118 |
166 |
76 |
) |
125 |
175 |
7D |
W |
119 |
167 |
77 |
~ |
126 |
176 |
7Е |
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 |
8А |
л |
139 |
213 |
8В |
м |
140 |
214 |
8С |
н |
141 |
215 |
8D |
О |
142 |
216 |
8Е |
п |
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 |
9А |
ы |
155 |
233 |
9В |
Ь |
156 |
234 |
9С |
|
э |
157 |
235 |
9D |
|
о |
158 |
236 |
9Е |
|
я |
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 |
8А |
1 |
179 |
263 |
ВЗ |
|
< |
139 |
213 |
8В |
г1 |
180 |
264 |
В4 |
|
н> |
140 |
214 |
8С |
р |
181 |
265 |
В5 |
|
к |
141 |
215 |
8D |
I |
182 |
266 |
В6 |
|
ъ |
142 |
216 |
8Е |
ё |
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 |
9А |
Г |
195 |
303 |
СЗ |
|
> |
155 |
233 |
9В |
Д |
196 |
304 |
С4 |
|
Ш |
156 |
234 |
9С |
Е |
197 |
305 |
С5 |
|
К |
157 |
235 |
9D |
X |
198 |
306 |
С6 |
|
и |
158 |
236 |
9Е |
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 |