лизация базового класса of structure инициализация структуры initializer инициализатор initializer-list список-инициализаторов inline inline function функция-подстановка member function функция-член inline input and output ввод-вывод of built-in type ввод встроенных типов of user-defined type ввод пользовательских типов operator >> операция ввода >> int int type тип int type specifier спецификация типа int integer constant целая константа conversion целочисленное преобразование integral promotion стандартное целочисленное преобразование type целочисленный тип interface интерфейс class интерфейсный класс inheritance наследование интерфейса fat обширный интерфейс specifications спецификации интерфейса internal linkage внутреннее связывание structure внутренняя структура I/O buffering буферизация ввода-вывода iteration итерация statement оператор итерации J jump statement оператор перехода jump-statement оператор-перехода K keyword служебное слово list список служебных слов L label метка case метка case default метка default scope of область видимости метки labeled statement помеченный оператор language язык design and проектирование и язык high-level язык высокого уровня low-level язык низкого уровня layout bit-field расположение битовых полей class objects расположение объектов класса left shift operator операция сдвига влево less than operator операция меньше чем than or equal to operator операция меньше или равно levels of abstraction уровни абстракции lexical conventions лексические соглашения library библиотека design проектирование библиотеки headers библиотека заголовочных файлов initialization инициализация библиотеки lifetime of object время жизни объекта linkage связывание consistency согласованное связывание error ошибка связывания external внешнее связывание internal внутреннее связывание linker-specification спецификация-связи linker редактор связей Lisp Лисп list of operator functions список операторных функций literal литерал constants литеральные константы loader загрузчик local class declaration описание локального класса class member function функция-член локального класса class, scope of область видимости локального класса scope локальная область видимости locking блокирование (замок) logical AND operator операция логическое И OR operator операция логическое ИЛИ negation operator операция логического отрицания operators, bitwise поразрядные логические операции long long constant константа long double long double double constant константа long double double type тип long double type тип long loop statement оператор цикла lvalue адрес assignment and адрес и присваивание cast приведение адреса conversion преобразование адреса modifiable изменяемый адрес M macro макрокоманда definition, preprocessing макроопределение expansion, preprocessing макроподстановка function-like функциональная макрокоманда name, scope of область видимости макроопределения names, predefined предопределенные макроимена preprocessing макрообработка syntax summary синтаксис макроопределений (сводка) maintenance, software сопровождение программ management управление free store управление свободной памятью memory управление памятью manipulator манипулятор member член member-declaration описание-члена member-declarator описатель-члена member-list список-членов modifiable lvalue изменяемый адрес modular programming модульное программирование modularity модульность multicharacter constant многосимвольная константа multidimensional array многомерный массив multiple inheritance множественное наследование multiplication operator операция умножения multiplicative-expression мультипликативное-выражение N name имя global глобальное имя hiding упрятывание имени length of длина имени linkage of local связывание локального имени overloaded function имя перегруженной функции overloaded member имя перегруженного члена qualified уточненное имя scope of область видимости имени nested class declaration описание вложенного класса class, scope of область видимости вложенного класса new operator операция new newline \n конец строки \n node class узловой класс null character символ null '\0' pointer пустой указатель (null) O object объект object-oriented programming объектно-ориентированное программирование octal constant восьмеричная константа number восьмеричное число operand const операнд const reference операнд ссылка volatile операнд volatile operator , операция , ! операция ! # операция # ## операция ## %= операция %= && операция && &= операция &= *= операция *= *=, user-defined пользовательская операция *= +, user-defined пользовательская операция + ++ операция ++ ++, user-defined пользовательская операция ++ += операция += -, user-defined пользовательская операция - -- операция -- --, user-defined пользовательская операция -- -= операция -= ->, user-defined пользовательская операция -> /= операция /= :: операция :: <<, output операция вывода << <<= операция <<= =, user-defined пользовательская операция = >>, input операция ввода >> >>= операция >>= ^= операция ^= address-of операция взятия адреса assignment операция присваивания associativity ассоциативность операций binding strength порядок выполнения операций built-in встроенные операции function call операция вызова функции precedence приоритет операций sizeof операция sizeof subscripting операция индексации summary сводка операций user-defined пользовательская операция operator function операторная функция function, list of список операторных функций order of argument evaluation порядок вычисления параметров of evaluation порядок вычислений output formatted форматированный вывод input and ввод и вывод of built-in type вывод встроенных типов of user-defined type вывод пользовательских типов operator << операция вывода << overflow переполнение overloaded assignment operator перегрузка операции присваивания binary operator перегрузка бинарной операции decrement operator перегрузка декремента function call operator перегрузка операции вызова function name перегрузка имени функции increment operator перегрузка инкремента member access operator перегрузка операции выбора члена member name перегрузка имени члена operator перегрузка операции subscripting operator перегрузка индексации unary operator перегрузка унарной операции overloading перегрузка and access перегрузка и доступ and scope перегрузка и область видимости resolution разрешение перегрузки resolution rules правила разрешения перегрузки overriding virtual function переопределение виртуальной функции P paradigm, programming парадигма программирования placement указание размещения pointer указатель arithmetic арифметические операции указателей assignment to присваивание указателю comparison сравнение указателей const указатель const conversion преобразование указателей declaration описание указателя null пустой указатель null size of размер указателя substraction вычитание указателей type тип указателя postfix ++ and -- постфиксные ++ и -- expression постфиксное выражение precedence of operator приоритет операций predefined address-of operator предопределенная операция взятия адреса assignment operator предопределенное присваивание macronames предопределенные макроимена prefix ++ and -- префиксные ++ и -- preprocessing макрообработка directive макрокоманда directive, error макрокоманда error directive, null макрокоманда null directive, pragma макрокоманда pragma macro definition макроопределение macro expansion макроподстановка (подстановка) syntax summary сводка макрокоманд primary expression первичное выражение private private base class частный базовый класс class member частный член класса procedural programming процедурное программирование program программа environment окружение программы partitioning разбиение программы start запуск программы termination завершение программы protected protected member защищенный член member access доступ к защищенному члену prototypes прототипы public public class member общий член класса pure specifier спецификация pure virtual function чисто виртуальная функция pure-specifier спецификация-pure Q qualified name уточненное имя qualified-class-name уточненное-имя-класса qualified-name уточненное-имя qualified-type-name уточненное-имя-типа queue empty пустая очередь quote, single одиночная кавычка double двойная кавычка R range checking контроль диапазона recursion рекурсия recursive decent parser анализатор рекурсивного спуска function call рекурсивный вызов функции reference ссылка assignment присваивание ссылки assignment to присваивание ссылке call by вызов по ссылке cast приведение ссылки conversion преобразование ссылки const ссылка const declaration описание ссылки initialization инициализации ссылки operand операнд ссылка overloading and перегрузка и ссылка volatile ссылка volatile register declaration описание register initialization инициализация регистра relational operator операция отношения relational-expression выражение-отношения reserved identifier зарезервированный идентификатор resolution ambiguity разрешение неоднозначности scoping ambiguity разрешение неоднозначности области видимости template function overloading разрешение перегрузки шаблонной функции resource acquisition запрос ресурса exhaustion исчерпание ресурса release освобождение ресурса re-throw повторный запуск (особой ситуации) return return return statement оператор return return type тип возвращаемого значения run-time error динамическая ошибка initialization динамическая инициализация type information динамическая информация о типе S scope область видимости class область видимости класса file файловая область видимости function область видимости функции global глобальная область видимости local локальная область видимости of label область видимости метки of local class область видимости локального класса of macro name область видимости макроимени of name область видимости имени of nested class область видимости вложенного класса resolution operator операция разрешения области видимости rules summary сводка правил области видимости separate compilation раздельная трансляция shift-expression выражение-сдвига short type тип short type specifier спецификация типа short side effects побочные эффекты sign extension размножение знака signed char type тип signed char type знаковый тип simple-type-name имя-простого-типа Simula Симула size of pointer размер указателя of string размер строки of structure размер структуры sizeof operator операция sizeof Smalltalk Smalltalk source file исходный файл file, inclusion включение исходного файла special character специальный символ specifier auto спецификация auto declaration спецификация описания friend спецификация friend function спецификация функции inline спецификация inline static спецификация static storage class спецификация класса памяти template спецификация шаблона типа typedef спецификация typedef virtual спецификация virtual stack unwinding раскручивание стека standard component стандартный компонент conversion стандартное преобразование headers стандартные заголовочные файлы include directory стандартный каталог включаемых файлов libraries стандартные библиотеки statement оператор break оператор break compound составной оператор continue оператор continue declaration оператор описания do оператор do empty пустой оператор expression оператор выражения for оператор for goto оператор goto if оператор if summary сводка операторов switch оператор switch (переключатель) syntax summary синтаксис операторов while оператор while static type checking статический контроль типов static static class member статический член класса linkage of связывание статических local object статический локальный объект member статический член member declaration описание статического члена member definition определение статического члена member function статическая функция-член specifier спецификация static storage class статический класс памяти stream closing of закрытие потока file and файл и поток state состояние потока string строковый поток string class строковый класс concatenation конкатенация строк constant константа строка type of тип строки wide-character широкосимвольная строка struct struct type specifier спецификация типа struct structure структура initialization of инициализация структуры subclass вложенный класс subscripting user-defined пользовательская операция индексации summary class declaration syntax синтаксис описаний класса compatibility with ANSI C совместимость с ANSI C compatibility with C совместимость с С declaration syntax синтаксис описаний declarator syntax синтаксис описателей exception handling syntax синтаксис особых ситуаций expression syntax синтаксис выражений macro syntax синтаксис макрокоманд scope rules правила областей видимости statement syntax синтаксис операторов template syntax синтаксис шаблонов типа support for data abstraction поддержка абстракции данных for object-oriented programming поддержка объектно-ориентированного программирования T template шаблон типа class шаблонный класс class declaration описание шаблонного класса class definition определение шаблонного класса declaration описание шаблона типа function шаблонная функция function declaration описание шаблонной функции function definition определение шаблонной функции linkage of связывание шаблона типа member function шаблонная функция-член specifier спецификация template syntax summary синтаксис шаблона типа template-arg парам-шаблона-типа template-arg-list список-парам-шаблона-типа template-argument параметр-шаблона-типа template-argument-list список-параметров-шаблона-типа template-class-name имя-шаблонного-класса template-declaration описание-шаблона-типа temporary временный объект this this throw throw throw-expression выражение-запуска throwing, exception запуск особой ситуации throw-point точка запуска token лексема tools design проектирование сервисных программ translation phases стадии трансляции unit единица трансляции trigraph триграф try try try-block проверяемый-блок type тип user-defined пользовательский тип type-specifier спецификация-типа U unary expression унарное выражение minus operator операция унарный минус operator унарная операция operator, user-defined пользовательская унарная операция plus, operator операция унарный плюс unary-expression унарное-выражение unary-operator унарная-операция uncaught exception неперехваченная особая ситуация undeclared argument неописанный параметр underscore character символ подчеркивания _ unexpected exceptions неожиданные особые ситуации union объединение anonymous безымянное объединение constructor конструктор объединения destructor деструктор объединения discriminating контролируемое объединение initialization инициализация объединения member function функция-член объединения type specifier спецификация типа union UNIX UNIX unsigned arithmetic беззнаковая арифметика char type тип unsigned char constant беззнаковая константа type беззнаковый тип type specifier спецификация типа unsigned V vertical tab \v вертикальная табуляция \v virtual virtual base class виртуальный базовый класс destructor виртуальный деструктор function виртуальная функция function access доступ к виртуальной функции function call вызов виртуальной функции function, type of тип виртуальной функции specifier спецификация virtual user-defined conversion виртуальное пользовательское преобразование void void argument пустой параметр pointer to указатель типа void* type тип void type specifier спецификация типа void volatile volatile member function функция-член volatile operand операнд volatile reference ссылка volatile type тип volatile type specifier спецификация типа volatile W waterfall model модель каскад white space обобщенный пробел wide-character string широкосимвольная строка  * ПРИМЕРЫ *  b1_1_1.cxx #include <stream.hxx> main() { cout << "Hello, world\n"; } b1_1_3.cxx #include <stream.hxx> main () { int inch = 0; cout << "inches="; cin >> inch; cout << inch; cout << "in = "; cout << inch*2.54; cout << " cm\n"; } b1_4_5v.cxx #include <stream.hxx> main() { const float fac = 2.54; float x, in, cm; char ch = 0; for ( int i= 0; i< 8; i++) { cerr << "enter length: "; cin >> x >> ch; if (ch == 'i' ) { // inch in = x; cm = x*fac; } else if (ch == 'c') { // cm in = x/fac; cm = x; } else in = cm = 0; cerr << in << "in = " << cm << " cm\n"; } } b1_5.cxx #include <stream.hxx> extern float pow(float, int); main() { for (int i=0; i<10; i++) cout << pow(2,i) << "\n"; } extern void error(char *); float pow(float x, int n) { if (n < 0) { error ("sorry, negative exponent to pow()"); return 0; } switch (n) { case 0: return 1; case 1: return x; default: return x*pow(x,n-1); } } void error(char *s) { cout << s; } b1__13.cxx #include <stream.hxx> // 1.11 class vector { int *v; int sz; public: vector(int); // constructor ~vector(); // destructor int size() { return sz; } void set_size(int); int& operator[](int); int& elem(int i) { return v[i]; } }; // 1.13 class vec : public vector { int low, high; public: vec(int, int); int& elem(int); int& operator[](int); }; main() { vector a(10); for (int i=0; i<a.size(); i++) { a[i] = i; cout << a[i] << " "; } cout << "\n"; vec b(10,19); for (i=0; i<b.size(); i++) b[i+10] = a[i]; for (i=0; i<b.size(); i++) cout << b[i+10] << " "; cout << "\n"; } extern void exit(int); // 1.13 void error(char* p) { cerr << p << "\n"; exit (1); } // 1.11 vector::vector(int s) { if (s<=0) error("bad vector size"); sz = s; v = new int[s]; } int& vector::operator[](int i) { if (i<0 || sz<=i) error("vector index out of range"); return v[i]; } vector::~vector() { delete v; } // 1.13 int& vec::elem(int i) { return vector::elem(i-low); } vec::vec(int lb, int hb) : (hb-lb+1) { if (hb-lb<0) hb = lb; low = lb; high = hb; } void vector::set_size(int) { /* dummy */ } int& vec::operator[](int i) { if (i<low || high<i) error("vec index out of range"); return elem(i); } b1__14.cxx #include<stream.hxx> extern void exit( int ); extern void error( char* ); // 1.11 class vector { int *v; int sz; public: vector(int); // constructor ~vector(); // destructor int size() { return sz; } void set_size(int); int& operator[](int); int& elem(int i) { return v[i]; } }; vector::vector(int s) { if (s<=0) error("bad vector size"); sz = s; v = new int[s]; } int& vector::operator[](int i) { if (i<0 || sz<=i) error("vector index out of range"); return v[i]; } vector::~vector() { delete v; } // 1.14 class Vec : public vector { public: Vec(int s) : (s) {} Vec(Vec&); ~Vec() {} void operator=(Vec&); void operator*=(Vec&); void operator*=(int); }; Vec::Vec(Vec& a) : (a.size()) { int sz = a.size(); for (int i = 0; i<sz; i++) elem(i) =a.elem(i); } void Vec::operator=(Vec& a) { int s = size(); if (s!=a.size()) error("bad vector size for ="); for (int i =0; i<s; i++) elem(i)=a.elem(i); } Vec operator+(Vec& a, Vec& b) { int s = a.size(); if (s != b.size()) error("bad vector size for +"); Vec sum(s); for (int i=0; i<s; i++) sum.elem(i) = a.elem(i) + b.elem(i); return sum; } void error(char* p) { cerr << p << "\n"; exit (1); } void vector::set_size(int) { } main() { Vec a(10); Vec b(10); for (int i=0; i<a.size(); i++) a[i] = i; b = a; Vec c = a+b; for (i=0; i<c.size(); i++) cout << c[i] << "\n"; } b1__16.cxx #include <vector.hxx> declare(vector,int); implement(vector,int); main() { vector(int) vv(10); vv[2] = 3; vv[10] = 4; // range error } b2_1_3.cxx #include <stream.hxx> int a = 1; void f() { int b = 1; static int c = 1; cout << " a = " << a++ << " b = " << b++ << " c = " << c++ << "\n"; } main () { while (a < 4) f(); } b2_3.cxx #include <stream.hxx> main() { int* p = new int; cout << "sizeof(int) = " << sizeof(int) "\n"; } b2_3_6a.cxx #include <stream.hxx> extern int strlen(char*); char alpha[] = "abcdefghijklmnopqrstuvwxyz"; main () { int sz = strlen(alpha); for (int i=0; i<sz; i++) { char ch = alpha[i]; cout << "'" << chr(ch) << "'" << " = " << ch << " = 0" << oct(ch) << " = 0x" << hex(ch) << "\n"; } } b2_3_6b.cxx #include <stream.hxx> char v[2][5] = { 'a', 'b', 'c', 'd', 'e', '0', '1', '2', '3', '4' }; main() { for ( int i = 0; i<2; i++) { for (int j = 0; j <5; j++) cout << "v[" << i << "][" << j << "]=" << chr(v[i][j]) << " "; cout << "\n"; } } b2_3_7.cxx #include <stream.hxx> main() { char cv[10]; int iv[10]; char* pc = cv; int* pi = iv; cout << "char* " << long(pc+1)-long(pc) << "\n"; cout << "int* " << long(pi+1)-long(pi) << "\n"; } b2_3__10.cxx #include <stream.hxx> struct pair { char* name; int val; }; extern int strlen(char*); extern int strcpy(char*, char*); extern int strcmp(char*, char*); const large = 1024; static pair vec[large]; pair* find(char* p) { for (int i=0; vec[i].name; i++) if (strcmp(p,vec[i].name)==0) return &vec[i]; if (i== large) return &vec[large-1]; return &vec[i]; } int& value(char* p) { pair* res = find(p); if (res->name == 0) { res->name = new char[strlen(p)+1]; strcpy(res->name,p); res->val = 0; } return res->val; } const MAX = 256; main () { char buf [MAX]; while ( cin>>buf) value(buf)++; for (int i=0; vec[i].name; i++) cout << vec[i].name << ":" << vec[i].val << "\n"; } b3_1all.cxx #include <xstream.hxx> #include <ctype.h> enum token_value { NAME, NUMBER, END, PLUS = '+', MINUS = '-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' }; token_value curr_tok; struct name { char* string; name* next; double value; }; const TBLSZ = 23; name* table[TBLSZ]; int no_of_errors; double error(char* s) { cerr << "error: " << s << "\n"; no_of_errors++; return 1; } extern int strlen(const char*); extern int strcmp(const char*, const char*); extern char* strcpy(char*, const char*); name* look(char* p, int ins = 0) { int ii= 0; char *pp = p; while (*pp) ii = ii<<1 ^ *pp++; if (ii < 0) ii = -ii; ii %= TBLSZ; for (name* n=table [ii]; n; n=n->next) if (strcmp(p,n->string) == 0) return n; if (ins == 0) error("name not found"); name* nn = new name; nn->string = new char[strlen(p) + 1]; strcpy(nn->string,p); nn->value = 1; nn->next = table[ii]; table[ii] = nn; return nn; } inline name* insert(char* s) { return look (s,1); } token_value get_token(); double term(); double expr() { double left = term(); for (;;) switch (curr_tok) { case PLUS: get_token(); left += term(); break; case MINUS: get_token(); left -= term(); break; default : return left; } } double prim(); double term() { double left = prim(); for (;;) switch (curr_tok) { case MUL: get_token(); left *= prim(); break; case DIV: get_token(); double d = prim(); if (d == 0) return error("divide by o"); left /= d; break; default: return left; } } int number_value; char name_string[80]; double prim() { switch (curr_tok) { case NUMBER: get_token(); return number_value; case NAME: if (get_token() == ASSIGN) { name* n = insert(name_string); get_token(); n->value = expr(); return n->value; } return look(name_string)->value; case MINUS: get_token(); return -prim(); case LP: get_token(); double e = expr(); if (curr_tok != RP) return error(") expected"); get_token(); return e; case END: return 1; default: return error ("primary expected"); } } token_value get_token() { char ch = 0; do { if(!cin.get(ch)) return curr_tok = END; } while (ch!='\n' && isspace(ch)); switch (ch) { case ';': case '\n': cin >> WS; return curr_tok=PRINT; case '*': case '/': case '+': case '-': case '(': case ')': case '=': return curr_tok=ch; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': cin.putback(ch); cin >> number_value; return curr_tok=NUMBER; default: if (isalpha(ch)) { char* p = name_string; *p++ = ch; while (cin.get(ch) && isalnum(ch)) *p++ = ch; cin.putback(ch); *p = 0; return curr_tok=NAME; } error ("bad token"); return curr_tok=PRINT; } } int main(int argc, char* argv[]) { switch (argc) { case 1: break; case 2: cin = *new istream(strlen(argv[1]),argv[1]); break; default: error("too many arguments"); return 1; } // insert predefined names: insert("pi")->value = 3.1415926535897932385; insert("e")->value = 2.7182818284590452354; while (1) { get_token(); if( curr_tok == END) break; if (curr_tok == PRINT) continue; cout << expr() << "\n"; } return no_of_errors; } b3_2_6a.cxx extern void strcpy(char *,char *); extern void exit(int); extern int strlen(char *); char *save_string(char* p) { char* s = new char[strlen(p)+1]; strcpy(s,p); return s; } int main (int argc, char* argv[]) { if (argc < 2) exit(1); int size = strlen(argv[1])+1; char* p = save_string (argv[1]); delete[size] p; } b3_2_6b.cxx #include <stream.hxx> extern void exit( int ); void out_of_store() { cout << "operator new failed: out of store\n"; exit(1); } typedef void (*PF)(); extern PF set_new_handler(PF); main() { set_new_handler(&out_of_store); char *p = new char[100000000]; cout << "done, p = " << long(p) << "\n"; } b4_6_8.cxx // This version of the program does not assume sizeof(int)==sizeof(char*) ! #include <stream.hxx> #include <stdarg.hxx> extern void exit(int); void error (int ...); main(int argc, char* argv[]) { switch (argc) { case 1: error(0,argv[0],(char*)0); break; case 2: error(0,argv[0],argv[1],(char*)0); break; default : error(1,"with",dec(argc-1),"arguments",(char*)0); } } void error(int n ...) { va_list ap; va_start(ap,n); for (;;) { char *p = va_arg(ap,char*); if (p == 0) break; cerr << p << " "; } va_end(ap); cerr << "\n"; if (n) exit(n); } b4_6_9.cxx #include <stream.hxx> struct user { char *name; char* id; int dept; }; typedef user* Puser; user heads[] = { "Mcilroy M.D", "doug", 11271, "Aho A.v.", "ava", 11272, "Weinberger P.J.", "pjw", 11273, "Schryer N.L.", "nls", 11274, "Schryer N.L.", "nls", 11275, "Kernighan B.W.", "bwk", 11276 }; typedef int (*CFT)(char*,char*); void sort(char* base, unsigned n, int sz, CFT cmp) { for (int i=0; i<n-1; i++) for (int j=n-1; i<j; j--) { char* pj = base+j*sz; char *pj1 = pj-sz; if ((*cmp)(pj,pj1) <