// ... } , , . . , , , . , (inline). : inline fac(int i) { return i<2 ? 1 : n*fac(n-1); } inline , fac , ($$R.7.1.2). fac(6) 720. - -, -, , , - . , , , 6*5*4*3*2*1, - 6*fac(5), fac(6). , , , - . inline . 4.6.3  , . . , , . ($$4.6.5). , ($$4.6.8), ($$4.6.7). : void f(int val, int& ref) { val++; ref++; } f() val++ , ref++ - . void g() { int i = 1; int j = 1; f(i,j); } j, i. i , j . $$2.3.10 , , , , (. $$10.2.2). , , , . const, , , : void f(const large& arg) { // "arg" // } const , : void g(large& arg); // , g() arg : const , . , , , const , . : extern int strlen(const char*); // <string.h> extern char* strcpy(char* to, const char* from); extern int strcmp(const char*, const char*); . , . , const , , ($1.4.2). , , , const&, const . const T&, , , T, . float fsqrt(const float&); // sqrt void g(double d) { float r; r = fsqrt(2.0f); // // , 2.0f r = fsqrt(r); // r r = fsqrt(d); // // , float(d) } - const , , : void update(float& i); void g(double d) { float r; update(2.0f); // : - update(r); // : r update(d); // : } 4.6.4  void, . : int f() { } // void g() { } // return . : int fac(int n) { return (n>1) ? n*fac(n-1) : 1; } return: int fac(int n) { if (n > 1) return n*fac(n-1); else return 1; } , . , return , . return , . : double f() { // ... return 1; // double(1) } . , . , , : int* f() { int local = 1; // ... return &local; // } , , - : int& f() { int local = 1; // ... return local; // } , , . : int& f() { return 1; } // 4.6.5 - , . : int strlen(const char*); void f() { char v[] = ""; strlen(v); strlen(""); } , T[] T*, . - . , , . . , . , , . , . : , , (. $$1.2.5). : void compute1(int* vec_ptr, int vec_size); // 1- struct vec { // 2- int* ptr; int size; }; void compute2(vec v); , , . : char* day[] = { "mon", "tue", "wed", "thu", "fri", "sat", "sun" }; , - . , : void print_m34(int m[3][4]) { for (int i = 0; i<3; i++) { for (int j = 0; j<4; J++) cout << ' ' << m[i][j]; cout << '\n'; } } , - , . ($$R.8.2.4), : void print_mi4(int m[][4], int dim1) { for ( int i = 0; i<dim1; i++) { for ( int j = 0; j<4; j++) cout << ' ' << m[i][j]; cout << '\n'; } } - . "" : void print_mij(int m[][], int dim1, int dim2) // { for ( int i = 0; i<dim1; i++) { for ( int j = 0; j<dim2; j++) cout << ' ' << m[i][j]; cout << '\n'; } } -, m[][] , . -, m[i][j] *(*(m+i)+j), , , , . : void print_mij(int** m, int dim1, int dim2) { for (int i = 0; i< dim1; i++) { for (int j = 0; j<dim2; j++) cout << ' ' << ((int*)m)[i*dim2+j]; // cout << '\n'; } } , , , , . , : int* v = (int*)m; // ... v[i*dim2+j] . . , (. 18 $$7.13). 4.6.6  . , . . ++ . : +, , , . , , .. . : void print(int); // void print(const char*) // - . , , . , , , . , sqrt, print open, . , , , + , * << ($$7.2), ($$5.2.4 $$7.3.1), . f , f . , , f. , , . : void print(double); void print(long); void f() { print(1L); // print(long) print(1.0); // print(double) print(1); // , : // print(long(1)) print(double(1)) ? } $$R.13.2. . : [1] : (, , T const T). [2] , $$R.4.1 (.. char int, short int int), float double. [3] , $$R.4 (, int double, derived* base*, unsigned int). [4] ($$R.12.3). [5] ... . , , . ++. print: void print(int); void print(const char*); void print(double); void print(long); void print(char); print() : void h(char c, int i, short s, float f) { print(c); // : print(char) print(i); // : print(int) print(s); // : // print(int) print(f); // : // print(double) print('a'); // : print(char) print(49); // : print(int) print(0); // : print(int) print("a"); // : // print(const char*) } print(0) print(int), 0 int. print('a') print(char), .. 'a' - char ($$R.2.5.2). , , . , , , . : int pow(int, int); double pow(double, double); // <math.h> complex pow(double, complex); // <complex.h> complex pow(complex, int); complex pow(complex, double); complex pow(complex, complex); void k(complex z) { int i = pow(2,2); // pow(int,int) double d = pow(2.0,2); // pow(double,double) complex z2 = pow(2,z); // pow(double,complex) complex z3 = pow(z,2); // pow(complex,int) complex z4 = pow(z,z); // pow(complex,complex) } 4.6.7  , . , , (, , . $$5.2.4). . . , . void print (int value, int base =10); void F() { print(31); print(31,10); print(31,16); print(31,2); } : 31 31 1f 11111 print: void print(int value, int base); inline void print(int value) { print(value,10); } print, . , . : int f(int, int =0, char* =0); // int g(int =0, int =0, char*); // int h(int =0, int, char* =0); // , * = , *= : int nasty(char*=0); // 4.6.8  , . (...), : ", , ". : int printf(const char* ...); printf char*, ( ) . : printf("Hello, world\n"); printf("My name is %s %s\n", first_name, second_name); printf("%d + %d = %d\n", 2,3,5); . printf , . , . , %s -" char*", %d -" int" (. $$10.6). , , . , printf("My name is %s %s\n",2); , ( ) . . , , . char short int, float double, , , . , , , . , , , . , , . , : extern "C" int fprintf(FILE*, const char* ...); extern "C" int execl(const char* ...); , <stdarg.h>, . , . . , : extern void error(int ...) extern char* itoa(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,argv[0], "With",itoa(argc-1),"arguments",(char*)0); } // ... } itoa , . : #include <stdarg.h> void error(int severity ...) /* "severity" ( ) , */ { va_list ap; va_start(ap,severity); // for (;;) { char* p = va_arg(ap,char*); if (p == 0) break; cerr << p << ' '; } va_end(ap); // cerr << '\n'; if (severity) exit(severity); } va_start() va_list. va_start va_list . va_arg(). va_arg . va_arg() , , . , va_start, va_end. , va_start() , - . va_end() . 0 (char*)0 , sizeof(int) sizeof(char*). , , , . 4.6.9  : . , , . : void error(char* p) { /* ... */ } void (*efct)(char*); // void f() { efct = &error; // efct error (*efct)("error"); // error efct } (efct ) - *efct. () , *, *efct("error"). *(efct("error")), . . , efct("error") , .. , efct , , . , , . . : void (*pf)(char*); // void(char*) void f1(char*); // void(char*); int f2(char*); // int(char*); void f3(int*); // void(int*); void f() { pf = &f1; // pf = &f2; // : // pf = &f3; // : (*pf)("asdf"); // (*pf)(1); // : int i = (*pf)("qwer"); // : void int } , . , . : typedef int (*SIG_TYP)(int); // <signal.h> typedef void (SIG_ARG_TYP)(int); SIG_TYP signal(int, SIG_ARG_TYP); . , , , , . , : typedef void (*PF)(); PF edit_ops[] = { // &cut, &paste, &snarf, &search }; PF file_ops[] = { // &open, &reshape, &close, &write }; , , . : PF* button2 = edit_ops; PF* button3 = file_ops; , . , - , , . . , . , , , 3 2, : (*button2[3])(); , . , . . , .. , : typedef int (*CFT)(void*,void*); void sort(void* base, unsigned n, unsigned int sz, CFT cmp) /* "base" n ; , cmp. "sz". : */ { for (int i=0; i<n-1; i++) for (int j=n-1; i<j; j--) { char* pj = (char*)base+j*sz; // b[j] char* pj1 = pj - sz; // b[j-1] if ((*cmp)(pj,pj1) < 0) { // b[j] b[j-1] for (int k = 0; k<sz; k++) { char temp = pj[k]; pj[k] = pj1[k]; pj1[k] = temp; } } } } sort ; ( ), , . sort() , qsort() - . . , sort() : struct user { char* name; // char* id; // int dept; // }; typedef user* Puser; user heads[] = { "Ritchie D.M.", "dmr", 11271, "Sethi R.", "ravi", 11272, "SZYmanski T.G.", "tgs", 11273, "Schryer N.L.", "nls", 11274, "Schryer N.L.", "nls", 11275 "Kernighan B.W.", "bwk", 11276 }; void print_id(Puser v, int n) { for (int i=0; i<n; i++) cout << v[i].name << '\t' << v[i].id << '\t' << v[i].dept << '\n'; } , . , , , , : int cmp1(const void* p, const void* q) // , { return strcmp(Puser(p)->name, Puser(q)->name); } int cmp2(const void* p, const void* q) // { return Puser(p)->dept - Puser(q)->dept; } : int main() { sort(heads,6,sizeof(user), cmp1); print_id(heads,6); // cout << "\n"; sort(heads,6,sizeof(user),cmp2); print_id(heads,6); // } -, ($$R.13.3). , - void* , . int cmp3(const mytype*, const mytype*); sort(). , , cmp3() mytype*. , . 4.7  $$R.16. ++ , . : , . , , , . , . , , , , , , , . - , ++ . : #define - -. , = = - . : #define mac(a,b) argument1: a argument2: b mac , . a b mac(). expanded = mac(foo bar, yuk yuk) expanded = argument1: foo bar argument2: yuk yuk . : // : #define print(a,b) cout<<(a)<<(b) #define print(a,b,c) cout<<(a)<<(b)<<(c) // : #define fac(n) (n>1) ?n*fac(n-1) :1 C++, . , , . . : #define Case break;case #define forever for(;;) : #define PI 3.141593 #define BEGIN { #define END } : #define SQUARE(a) a*a #define INCR_xx (xx)++ #define DISP = 4 , : int xx = 0; // void f() { int xx = 0; // xx = SQUARE(xx+2); // xx = xx +2*xx+2; INCR_xx; // xx if (a-DISP==b) { // a-=4==b // ... } } ($$2.1.1), , , . : #define MIN(a,b) (((a)<(b))?(a):(b)) , , /* */, ++ , //. : #define m2(a) something(a) /* */ , , , . , . , , , , , . const, inline . : const int answer = 42; template<class T> inline T min(T a, T b) { return (a<b)?a:b; } 4.8  1. (*1) : , ; ; , ; , . , . : typedef. 2. (*1) ? ? typedef int (rifii&) (int, int); 3. (*1.5) , , "Hello, world". (name) "Hello, name". , : "Hello, ...". 4. (1.5) , , , cout. , cat concatenation - ). 5. (*2) ++. , . #define enum, const inline. .c , , ++. malloc() free() new delete. . 6. (*2) sort() ($$4.6.9), . 7. (*2) tnode $$R.9.3. , tnode. tnode. , . tnode , , new . , tnode. 8. (*1) itoa(), $$4.6.8. 9. (*2) , . /usr/include /usr/include/CC ( , ). . 10. (*2) , . ( ). 11. (*2) , cin cout . : s s^key[i], key - , . key , . key. key ( ), . 12. (*3) , , , (.. key) . : . D Kahn "The Codebreakers", Macmillan, 1967, New York, . 207-213. 13. (*3) , - printf() %s, %c %d. . printf() . %s , $$10.6. <stdarg.h>. 14. (*1) , typedef? 15. (*2) , . ? ? , i x? 16. (*1) ? #define PI = 3.141593; #define MAX(a,b) a>b?a:b #define fac(a) (a)*fac((a)-1) 17. (*3) , . cin, cout. . : , . 18. (*2) , (2) sqrt(), <math.h>. sqrt() . 19. (*2) print() $$4.6.7.  * 5.  " , , int float" - , , . , , , , , . , ,