. , , - . . . , . , , : [1] , [2] , [3] . , . , . , , , . , : // "v" . // "v" "f()". // // "init()". // "cleanup()". // "weird()". // "f()" . ++ . , ($$4.2) , ($$5.5). , . : a = b + c; // a b+c count++; // count , . , . , . , . : [1] : , , , ..; [2] ; [3] , : , ( ) , , , ; [4] ; [5] , ; [6] . : // tbl.c: . /* . " ..." . 411. */ // swap() , AT&T 3B20. /************************************ (c) 1991 AT&T, Inc **************************************/ . , , - , . , //, /* */, . 3.5  1. (*1) for while: for (i=0; i<max_length; i++) if (input_line[i] == '?') quest_count++; , , *p=='?'. 2. (*1) , : a = b + c * d << 2 & 8 a & 077 != 3 a == b || a == c && c < 5 c = x != 0 0 <= i < 7 f(1,2) + 3 a = - 1 + + b -- - 5 a = b == c ++ a = b = c = 0 a[4][2] *= * b ? c : * d * 2 a-b, c=d 3. (*2) 5 ++, . 4. (*2) 10 ++. 5. (*1) ++? ? 6. (*1) , : *p++ *--p ++a-- (int*)p->m *p.m *a[i] 7. (*2) : strlen() - , strcpy() - strcmp() - . ? , <string.h> . 8. (*1) , : void f(int a, int b) { if (a = 3) // ... if (a&077 == 0) // ... a := b+1; } , . 9. (*2) cat(), - , . , new. rev() , . , rev(p) p .. 10. (*2) ? void send(register* to, register* from, register count) // . { register n=(count+7)/8; switch (count%8) { case 0: do { *to++ = *from++; case 7: *to++ = *from++; case 6: *to++ = *from++; case 5: *to++ = *from++; case 4: *to++ = *from++; case 3: *to++ = *from++; case 2: *to++ = *from++; case 1: *to++ = *from++; } while (--n>0); } } ? 11. (*2) atoi(), - . , atoi("123") 123. atoi() , , , ++. ++. itoa() . 12. (*2) get_token() ($$3.12) , , , . 13. (*2) $$3.1 , sqrt(), log() sin(). : . , . 14. (*3) . : , . , . , . , . 15. (*1.5) , symbol name_string number_value: struct symbol { token_value tok; union { double number_value; char* name_string; }; }; 16.(*2.5) , ++. , cin : // /* */. cout. ( , ). . //, /* */ , . 17. (*2) , .  * 4 , - . - . , . , , , , . , : , , , , , . . 4.1  ++ , ($$R.3.2). ( , ), ( , const). , , . , ++ , , . . , , , . , . . , . , . . . , . "" , expr(), term() prim(). , : (), , . , . . . , "" , . , , , . , , , , . , , , . , , . , . - , . . 4.2  , , , , , . , , , . : // file1.c int a = 1; int f() { /* - */ } // file2.c extern int a; int f(); void g() { a = f(); } g() a f(), file1.c. extern , a file2.c , . a, extern , . . , . : // file1.c: int a = 1; int b = 1; extern int c; // file2.c: int a; extern double b; extern int c; : a ("int a;" - , "int a=0;"); b , ; c , . ( ) , , , . , ++: // file1.c: int a; int f() { return a; } // file2.c: int a; int g() { return f(); } -, f() file2.c, f() . -, , a . static, . : // file1.c: static int a = 6; static int f() { /* ... */ } // file2.c: static int a = 7; static int f() { /* ... */ } , a f . a f(). static, , . , . , , . , , . , , .. , . . , , - : // file1.c: struct S { int a; char b; }; extern void f(S*); // file2.c: struct S { int a; char b; }; void f(S* p) { /* ... */ } : ++. ( ). - , . , .. typedef, , : // file1.c: typedef int T; const int a = 7; inline T f(int i) { return i+a; } // file2.c: typedef void T; const int a = 8; inline T f(double d) { cout<<d; } : // file3.c: extern const int a; const int a = 77; // file4.c: extern const int a; void g() { cout<<a; } g() 77. 4.3  . , , . , , . : , , , . #include, ( ) . #include "-" , , -. , ++, . , , ++. . : , , . , , , : CC -E file.c file.c ( !), , CC -E . ( INCLUDE) < >. : #include <stream.h> // #include "myheader.h" // , ( /usr/include/CC, /usr/include). , : #include < stream.h> // <stream.h> , . , , . , , , , , , . , : struct point { int x, y; }; template<class T> class V { /* ... */ } extern int strlen(const char*); inline char get() { return *p++; } - extern int a; const float pi = 3.141593; enum bool { false, true }; class Matrix; #include <signal.h> #define Case break;case /* */ , , , . , : char get() { return *p++; } int a; const tb[i] = { /* ... */ }; .h, , , .c. "h-" "-" . : .C, cxx, .cpp .cc. . $$4.7. , ++ , , ++ : (const), - (inline), , , ($$8). , , . , . , , , . 4.3.1  : , , , . . .c: lex.c, syn.c, table.c main.c. dc.h , .c : // dc.h: #include <iostream.h> enum token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' }; extern int no_of_errors; extern double error(const char* s); extern token_value get_token(); extern token_value curr_tok; extern double number_value; extern char name_string[256]; extern double expr(); extern double term(); extern double prim(); struct name { char* string; name* next; double value; }; extern name* look(const char* p, int ins = 0); inline name* insert(const char* s) { return look(s,1); } , lex.c : // lex.c: #include "dc.h" #include <ctype.h> token_value curr_tok; double number_value; char name_string[256]; token_value get_token() { /* ... */ } , , , , , . , lex.c extern token_value get_token(); // ... token_value get_token() { /* ... */ } , . , get_token() token_value, int, lex.c : . syn.c : // syn.c: #include "dc.h" double prim() { /* ... */ } double term() { /* ... */ } double expr() { /* ... */ } table.c : // table.c: #include "dc.h" extern char* strcmp(const char*, const char*); extern char* strcpy(char*, const char*); extern int strlen(const char*); const int TBLSZ = 23; name* table[TBLSZ]; name* look(char* p, int ins) { /* ... */ } , table.c, . , .c extern. " ", , , . , strlen() main.c. , .. strlen() (, ). , dc.h extern, . , . , , . , ! , main.c: // main.c: , , #include "dc.h" double error(char* s) { /* ... */ } extern int strlen(const char*); int main(int argc, char* argv[]) { /* ... */ } . , ( , ; . 5-9). . , , . , . , . . 4.3.2  , . , , . . : , , . .c .h, , . .c .h, .h, . . , error() , <iostream.h>. , . main.c: // error.h: extern int no_of_errors; extern double error(const char* s); // error.c #include <iostream.h> #include "error.h" int no_of_errors; double error(const char* s) { /* ... */ } .c .h , .h , .c . , . : // table.h: struct name { char* string; name* next; double value; }; extern name* look(const char* p, int ins = 0); inline name* insert(const char* s) { return look(s,1); } // table.h: #include "error.h" #include <string.h> #include "table.h" const int TBLSZ = 23; name* table[TBLSZ]; name* look(const char* p, int ins) { /* ... */ } , <string.h>. . // lex.h: enum token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', PRINT=';', ASSIGN='=', LP='(', RP= ')' }; extern token_value curr_tok; extern double number_value; extern char name_string[256]; extern token_value get_token(); . , get_token() number_value name_string, . // lex.c: #include <iostream.h> #include <ctype.h> #include "error.h" #include "lex.h" token_value curr_tok; double number_value; char name_string[256]; token_value get_token() { /* ... */ } : // syn.h: extern double expr(); extern double term(); extern double prim(); // syn.c: #include "error.h" #include "lex.h" #include "syn.h" double prim() { /* ... */ } double term() { /* ... */ } double expr() { /* ... */ } , : // main.c: #include <iostream.h> #include "error.h" #include "lex.h" #include "syn.h" #include "table.h" int main(int argc, char* argv[]) { /* ... */ } . , ++. , , . : , 10 50 , 500 . , , . : , 10 ( ). (, ), . 4.4  ++ , , , ++ , . , , , , , . , , , , , , , , . , . , strcpy , : extern "C" char* strcpy(char*, const char*); extern char* strcpy(char*, const char*); strcpy() . , , . extern "C" , ++, , . , extern "C" , , . . "C" , . : extern "C" { char* strcpy(char*, const char); int strcmp(const char*, const char*) int strlen(const char*) // ... } , , ++, : extern "C" { #include <string.h> } ++. : #ifdef __cplusplus extern "C" { #endif char* strcpy(char*, const char*); int strcmp(const char*, const char*); int strlen(const char*); // ... #ifdef __cplusplus } #endif __cplusplus , extern "C" { ...}, . extern "C" { ... } , , : extern "C" { // // : static int st; int glob; } , - st , glob . , extern "C" . , , extern "C", , C++ , . : extern "C" int f(); int g() { return f(1); // : } 4.5  ( ): " ", " - ". ++? , . , . . .o, .c. .h, .o . , . : extern "C" { // // double sqrt(double); // <math.h> double sin(double); double cos(double); double exp(double); double log(double); // ... } sqrt.c, sin.c, cos.c, exp.c log.c, . math.a : $ CC -c sqrt.c sin.c cos.c exp.c log.c $ ar cr math.a sqrt.o sin.o cos.o exp.o log.o $ ranlib math.a $ . , . ar () math.a. , . ranlib ( ), , , ar. , : $ CC myprog.c math.a : math.a? .o, : $ CC myprog.c sqrt.o sin.o cos.o exp.o log.o , , .o . . myprog sqrt() cos(), , , : $ CC myprog.c sqrt.o cos.o , .. cos() sin(). , CC .a ( math.a), , , .o. , ( , , ). . 4.6  ++ - - , . , . . 4.6.1  , ( ) , . : extern double sqrt(double); extern elem* next_elem(); extern char* strcpy(char* to, const char* from); extern void exit(int); : , , . , , : double sr2 = sqrt(2); sqrt() 2.0. ++ . . , . 4.6.2  - , . - , . : extern void swap(int*, int*); // void swap(int* p, int* q) // { int t = *p; *p = *q; *q = *t; } , : void search(table* t, const char* key, const char*) { //