1 Алфавит языка Си включает: 1. Буквы латинского алфавита, строчные и заглавные: a - z, A - Z; 2. Цифры 0 - 9; 3. Символы + - / * = % & . , ; " ' ( ) [ ] { } | \ < > ? : ! _ ~ ^ Спецификаторы доступа: private protected public Идентификаторы - допустимые символы a - z, A Z, цифры 0 - 9, _(подчеркивание); - 1-й символ не может быть цифрой; enum Seasons { winter,spring,summer,autumn } s1,s2,s3; name1 NAME1 Total_5 _alpha Разделители пробел ; , * = ( ) [ ] { } : ... & (в препроцессоре # < >) Прочие: asm case default _cs _ds _es _ss template this namespace using Перечисления Имена в Seasons – целые константы winter=0, spring=1 и т.д. enum days { Su=5,Mo,Tu,We=11,Th,Fr,Sa }; Константы Ключевые слова, недопустимые в качестве идентификаторов: Спецификаторы типов: bool char int float double void Модификаторы типов: long short signed unsigned const volatile typedef cdecl near far huge interrupt pascal Теги интегральных типов: enum class struct union Спецификаторы классов памяти: auto extern static register Операторы языка: break if else for goto do while switch return try catch throw continue Операции языка: sizeof new delete typeid десятичные: цифры 0 - 9, первой цифрой не должен быть 0; 11 155 восьмеричные: 0 - 7, начинаются с 0; 012=10d 0123=83d 16-ричные: цифры 0 - 9, буквы a - f или A - F начинаются с 0x или 0X 0x12->18d 0X12 0x2f 0XA3->163d Длинные целые константы 12l 076L Беззнаковые константы Модификаторы функций: friend inline operator overload virtual 23u 42U 1996ul 2 Константы с плавающей точкой sizeof 3.14159 100. .152 .152e3=152 sizeof(e) - число байт,требуемых 3096E-5=0.3096 15f 125F для размещения в памяти объекта 3.1415926l 3e-8L - long double e; char delta[81]; b=sizeof(delta); Символьные константы 'А' '#' Специальные (управляющие) символьные константы \n перевод строки \t горизонтальная табуляция \v вертикальная табуляция \b забой \r возврат каретки \f перевод формата (новая страница) \a звуковой сигнал \' апостроф \" кавычки \\ обратная косая \033 байт в 8-ричном представлении \x1b 16\? знак вопроса \0 нулевой символ sizeof(тип)- число байт, требуемых для размещения в памяти данных, имеющих указанный в операции тип. i=sizeof(long); ++ ++а - префиксная форма записи; а++ - постфиксная форма записи. C++; эквивалентно a=b*c++; C=C+1; a=b*(++c); (тип) операция преобразования типа int n=10; float alpha,beta=25.5; alpha=(float)n+beta; Строковые константы alpha=float(n)+beta; "1st string.\n" "A" char *vls1="1st very long \ string."; char vls2[]="2nd very long" " string.\n"; Составное присваивание money-=price; price; money=money- ВЫРАЖЕНИЯ И ОПЕРАЦИИ С ДАННЫМИ. Условная операция a++; b=10; ? : x=(y*z)/w; ymax=(a>b)?a:b; a*b/c a=b=c -> -> (a*b)/c a=(b=c) (p==0)?(p=p+1):(p=p+2); 3 _________________________________ :: Доступ к глобальной <переменной :: Указание принадлежности к -> классу, структуре или объединению _________________________________ ( ) Вызов функции -> [ ] Выбор элемента массива . Выбор элемента касса, структуры или объединения -> -//-//- , адресуемой(го) указателем _________________________________ sizeof Определение размера <в байтах ! Логическое отрицание ~ Побитовое отрицание + Подтверждение знака Изменение знака ++ Увеличение на единицу -Уменьшение на единицу & Определение адреса * Обращение по адресу (тип) Преобразование типа new Выделение памяти delete Освобождение памяти _________________________________ .* Выбор элемента класса -> ->* через указатель ________________________________ * Умножение -> / Деление % Деление по модулю (определение остатка от деления) ________________________________ + Сложение -> Вычитание ________________________________ << Сдвиг влево -> >> Сдвиг вправо ________________________________ < Меньше -> <= Меньше или равно > Больше >= Больше или равно ________________________________ == Сравнение на равенство -> != Сравнение на неравенство ________________________________ & Побитовая операция И -> ________________________________ ^ Побитовая операция -> исключающее ИЛИ ________________________________ | Побитовая операция ИЛИ -> ________________________________ && Логическая операция И -> ________________________________ || Логическая операция ИЛИ -> ________________________________ ? : Условная операция <(арифметическое "если") ________________________________ = Присваивание <*= /= %= += -= <<= >>= &= ^= |= ________________________________ , Операция запятая -> ________________________________ Порядок обработки операндов && || ?: , v=(x=5)+(++x); -> v=11, x=6 -> <x=0, v=6, x=5 x=5; v=x+(x+1); ++x; Побочные эффекты add(i+1,i=j+2); int i,a[10]; i=0; a[i++]=i; 4 ОПЕРАТОРЫ. Формат и вложенность Оператор цикла с предусловием while (пока) if, if-else, switch, while, while(выражение) do-while, for оператор1; Оператор выражения language=C++; Оператор объявления int a; Составной оператор { int i=0; a+=5; i++; } { unsigned char k; k=getch(); printf("%c",k); } while(a<=255) { y*=x; a++; } Оператор цикла с постусловием do - while (делать, пока) do оператор1; while(выражение) x=0; do s[x]=0; while(++x<80); Оператор метки Оператор пошагового цикла for begin: a=1; Оператор условия if else if(выражение) оператор1; else оператор2; if(a>b) { c=1; d=2; } else {c=2; d=1; } if(a) b=c; if(!d) a=1; else if(b>a) a++; for(оператор1;выражение1; выражение2) оператор2; for(int i=0,j=n-1;i<n;i++,j--) a[i]=a[j]; for(i=0;i<10;line[i++]=0); 5 Оператор переключения switch Первая форма (редкая) switch(выражение) case константа1: case константа2: ... оператор - эквивалентна конструкции if(выражение==константа1 || выражение==константа2 ...) оператор за исключением того, что выражение вычисляется только один раз. switch(c) { case '+': n=a+b; break; case '-': n=a-b; break; case '*': n=a*b; break; case '/': n=a/b; break; default: cout<<"Error."; } Оператор завершения break; for(i=0;i<n;i++) if((a[i]=(b[i])==0) break; Оператор продолжения switch(n) case 2: case 4: case 6: delta=n; Вторая форма (общая) switch(выражение) { case константа1: case константа2: ... операторы case константа3: case константа4: ... операторы default: операторы } continue; for(i=0;i<n;i++) { if(a[i]!=0) continue; a[i]=b[i]; k++; } Оператор возврата return выражение1; return 1; return x*x; return; // для void 6 Указатели Операции с адресами y=&x; int *y; &(x+7) // ошибка &28 // ошибка *y=7; *x*=5; (*z)++; z=*y; Если y=&x и z=*y то z=x x - переменная y – ее адрес (указатель) z – содержимое адреса y *y - содержимое адреса y // *z=5, (*z)++ -> *z=6 *z++; int *p; //указатель на int int i=33; p=&i; *p=*p+1; //i=34 y++; y+n A000 значение x A001 <- Адрес x NULL A002 &x y=&x Указатели на указатели *y y z=*y // * - указатель z=*(&x) z=x int int int int i=88; *pi=&i; **ppi=&pi; ***pppi=&ppi; ***pppi -> 88 int *a,*b,*c; char* d,*e; float*f; int i,*ip=&i; //ИНИЦИАЛИЗАЦИЯ pppi -> (*pppi)==ppi -> (*ppi)==pi -> (*pi)==i char *(*(*var)())[10]; *(*(*pppi)) 7 Массивы (векторы) float echo[10]; int fox[5][20]; int a[5]={7,6,9}; // a[3]=a[4]=0 int b[][2]={{1,2},{3,4}, {5,6}}; // b[3][2] int c[][2]={1,2,3,4,5,6}; int d[][2]={{1},{2},{3}}; (*R32).Age=33; R32->Age=33; struct Err { Err d; ... }; // Ошибка struct Corr { Corr *pc; ... }; struct Beg{...} golf; struct next{ Beg st; ...}; struct A; // Неполное опр. struct B {struct A *pa}; char vls2[]="2nd very long" struct A {struct B *pb}; " string.\n"; struct a1 fox=&fox[0][0] { ... int oscar; sizeof }; struct a2 { ... Структуры a1 lima; }tango; struct Student { //... char FirstName[20]; char SecondName[20]; tango.lima.oscar=256; char SurnameName[20]; int Age,Year; char Dept[20]; }; Student St1; Student i81[31]; St1.FirstName[]=”Name”; Student *R32; // Указатель R32 – адрес объекта *R32 – сам объект 8 Функции Вызов функции Прототип int a=10,b=15,c; c=Max(a,b); void func1(int j,float* f); c=Max(9,10); void func1(int,float*); Передача аргументов double func2(); double func2(void); // вар. #include <iostream.h> void swap1(int x,int y) int func3(int x,...); { int z=y; Стандартные значения y=x; x=z; аргументов (по умолчанию) } void main() void DrawCircle(int x=100, { int y=100,int r=100); int a=5,b=10; swap1(a,b); void DrawCircle(int=100, cout<<a<<’ ’<<b<<endl; int=100,int=100); // a=5, b=10 } void DrawCircle(int x,int y=100,int r); // Ошибка void swap2(int& x,int& y) { DrawCircle(); // Вызов int z=y; DrawCircle(200); y=x; x=z; DrawCircle(200,300); } DrawCircle(,,400); //Ошибка //... swap2(a,b) Определение функции // a=10, b=5 int Max(int a,int b) { return a>b?a:b; } int Max(int a,int b) { if(a>b) return a; else return b; } void Show(Student& st); char* GetName(const Student& st) { return st.FirstName; } 9 int& Ref(int& x) { return x; } //... int a=5; Ref(a)=10; cout<<a<<endl; // a=10; int n=-15; void invert(int &k=n) { k=-k;} //... int a=10,b=20; float c=3.14; invert(); // n=15 invert(a); //a=-10 invert(a+b); //a=10,b=20 invert(int(c)); //c=3.14 Подставляемые функции inline int i,*a,*ip=&i; *ip *a=1; // Ошибка. L-выражение L-value char *p; int i; long n; (long*)p=&n; // Допустимо. (long)i=n; // Ошибка. Связь массивов с указателями int a[5]; *y int *y; y=&a[0]; y=a; a[i] ~ *(a+i) y[i] ~ *(y+i) inline int HiWord(long L) { return (int)(L>>16); } a[5] – массив a – имя массива y=&a[0] – адрес 0-го эл-та a - адрес 0-го элемента x0 – содерж. 0-го эл-та if, while, for, switch, goto a[0]=x0; a[1]=x1; x0 = *y = *a = a[0] x1 = *(y+1) = *(a+1)= a[1] y=a; y++; // Допустимо. a=y; a++; // Ошибки. b[i][j][k]=*(*(*(b+i)+j)+k)= *(b[i][j]+k) 10 PE[IE] PE – указатель на массив PE[IE] – IE-й элемент *(PE+IE) – другая форма *(IE+PE) ~ *(PE+IE) => IE[PE] int m[]={1,2,3,4}; m[0]==1 0[m]==1 ++ -- * & *p++ -> 1). *p char* month1[]={”январь”, ”февраль”,”март”}; Составные описатели 2). p++ i2 20 i1 10 *&i2 -> 20 *&++i2 -> 21 30 21 10 *p -> 21 *p++ -> 21 *p -> 10 30 21 10 ++*pi -> 11 30 21 11 *--p -> 21 30 21 10 ++*--p -> 31 31 21 int *arp[20]; int* arp[20]; //Массив ук. char month2[][10]={...}; int i1=10,i2=20,i3=30; int *p=&i2; i3 30 Массивы указателей 10 ++&i2; //Ошибка–не L-выражение --&i2++; // То же самое «изнутри - наружу» char *(*(*var)())[10]; 7 6 4 2 1 3 5 1. 2. 3. 4. 5. 6. 7. Идентификатор var – это указатель на функцию, возвращающую указатель на массив из 10 указателей на значения типа char. int *arp[5]; –массив указ. int (*par)[5]; - указатель на массив. long *fp(); - функция, возвр. указатель. long (*pf)(); - указатель на функцию, возвр. значение типа long. float (*f1())[3]; - функц. struct Student{}; Student& (*AS[5])(); массив указ. на функции, возвр. ссылки на структ. тип Student. 11 Преобразование типов указателей char c,*p=&c; void *v=p; //Неявное преобр char *q=(char*)v; //Явное v=&c; v++; // Ошибка (char*)v++; Указатели и константы char a,b; // Указатель на константу char const *str2="TTT"; const char *pcc=&a; pcc=&b; // *pcc='z'; // Ошибка. // Константный указатель char *const cpc=&a; // cpc=&b; // Ошибка. *cpc='z'; const k=10; int *p=&k; // Ошибка.