Алфавит языка Си++ включает:

1. Буквы латинского алфавита, строчные и заглавные:

   a - z, A - Z;

2. Цифры 0 - 9;

3. Символы +  -  /  *  =  %  &  .  ,  ;  "  '  (  )  [  ]  {  }  |  \  <  >  ?  :  !  _  ~  ^

 

  Идентификаторы (имена переменных, функций, меток и т.п.)

- допустимые символы a - z, A - Z, цифры 0 - 9, _(подчеркивание);

- 1-й символ не может быть цифрой.

Примеры допустимых идентификаторов:

 

name1  NAME1  Total_5   _alpha

 

  Разделители

пробел  ; , *  = ( ) [ ] { } : ... & (в препроцессоре - ещё # < >)

 

  Ключевые слова, недопустимые в качестве идентификаторов:

Спецификаторы типов:

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

 

Модификаторы функций:

friend inline operator overload

virtual

 

Спецификаторы доступа:

private  protected  public

 

Прочие:

asm case default _cs _ds _es _ss

template this namespace using

 

  Перечисления

 

enum Seasons

{ winter,spring,summer,autumn } s1,s2,s3;

 

Имена в Seasons – целые константы

winter=0, spring=1 и т.д.

 

enum days

{ Su=5,Mo,Tu,We=11,Th,Fr,Sa };

 

 

  Константы

 

десятичные:

цифры 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

 

Беззнаковые константы

 

  23u  42U  1996ul

 

 

Константы с плавающей точкой

 

3.14159  100.  .152  .152e3=152

3096E-5=0.3096   15f   125F

3.1415926l  3e-8L  -  long double

 

Символьные константы

 

  'А'   '#'

 

Специальные (управляющие) символьные константы

 

\n    перевод строки

\t    горизонтальная табуляция

\v    вертикальная табуляция

\b    забой

\r    возврат каретки

\f    перевод формата (новая страница)

\a    звуковой сигнал

\'    апостроф

\"    кавычки

\\    обратная косая

\033  байт в 8-ричном представлении

\x1b         16-

\?    знак вопроса

\0    нулевой символ

 

Строковые константы

 

"1st string.\n"   "A"

char *vls1="1st very long \

string.";

char vls2[]="2nd very long"

            " string.\n";

 

 

ВЫРАЖЕНИЯ И ОПЕРАЦИИ С ДАННЫМИ.

 

a++;  b=10;  x=(y*z)/w;

 

a*b/c  ->  (a*b)/c

a=b=c  ->  a=(b=c)

 

 

 

 

 

  sizeof

 

sizeof(e) - число байт,требуемых для размещения в памяти объекта e;

char delta[81];

b=sizeof(delta);

 

sizeof(тип)- число байт, требуемых для размещения в памяти данных, имеющих указанный в операции тип.

i=sizeof(long);

 

   ++

 

++а - префиксная форма записи;

а++ - постфиксная форма записи.

 

C++; эквивалентно  C=C+1;

 

a=b*c++;  a=b*(++c);

 

 

(тип) операция преобразования типа

 

int n=10;

float alpha,beta=25.5;

alpha=(float)n+beta;

 

alpha=float(n)+beta;

 

 

  Составное присваивание

 

money-=price;  money=money-price;

 

 

  Условная операция  ? :

 

ymax=(a>b)?a:b;

 

(p==0)?(p=p+1):(p=p+2);




  Операции по приоритету и порядку выполнения

_________________________________

::   Доступ к глобальной       <-

     переменной

::   Указание принадлежности к ->

     классу, структуре, объединению

     или пространству имён

_________________________________

( )    Вызов функции           ->

[ ]    Выбор элемента массива

 .     Выбор элемента касса,

       структуры или объединения

 ->          -//-   -//- ,

       адресуемой(го) указателем

_________________________________

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;




 ОПЕРАТОРЫ.


Формат и вложенность

 

if, if-else, switch, while,

do-while, for

 

Оператор выражения

 

language=C++;

 

Оператор объявления

 

int a;

 

Составной  оператор

 

{ int i=0; a+=5; i++; }

 

{

  unsigned char k;

  k=getch();

  printf("%c",k);

}

 

Оператор метки

 

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++;



Оператор цикла с предусловием while (пока)

 

while(выражение)

оператор1;

 

while(a<=255)

{

  y*=x; a++;

}

 

Оператор цикла с постусловием do - while (делать, пока)

 

do

  оператор1;

while(выражение)

 

x=0;

do

  s[x]=0;

while(++x<80);

 

Оператор пошагового цикла for

 

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);



Оператор переключения switch

 

Первая форма (редкая)

 

switch(выражение)

  case константа1:

  case константа2:

  ...

    оператор

 

- эквивалентна конструкции

 

  if(выражение==константа1 || выражение==константа2 ...)

     оператор

 

за исключением того, что выражение вычисляется только один раз.

 

switch(n)

  case 2: case 4: case 6:

  delta=n;

 

Вторая форма (общая)

 

switch(выражение)

{

  case константа1:

  case константа2:

  ...

    операторы

  case константа3:

  case константа4:

  ...

    операторы

  default:

    операторы

}

 

 

 

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;

 

 

Оператор продолжения

 

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

 

 

 

Указатели

 

y=&x;

 

&(x+7) // ошибка

&28    // ошибка

 

z=*y;

 

Если y=&x и z=*y то z=x

 

x - переменная

y – ее адрес (указатель)

 

z – содержимое адреса y

*y - содержимое адреса y

 

 

A000

 

значение x

A001

<- Адрес x

 

A002

&x

y=&x

 

 

 

*y

y

 

 

 

z=*y  // * - указатель

z=*(&x)

z=x

 

int *a,*b,*c;

char* d,*e;

float*f;

int i,*ip=&i; //ИНИЦИАЛИЗАЦИЯ

 

char *(*(*var)())[10];



Операции с адресами

 

int *y;

 

*y=7;

*x*=5;

(*z)++;

 

// *z=5, (*z)++ -> *z=6

*z++;

 

int *p; //указатель на int

int i=33;

p=&i;

*p=*p+1; //i=34

 

y++;

y+n

 

NULL

 

 

Указатели на указатели

 

int i=88;

int *pi=&i;

int **ppi=&pi;

int ***pppi=&ppi;

 

***pppi -> 88

 

pppi ->

(*pppi)==ppi ->

(*ppi)==pi ->

(*pi)==i

 

*(*(*pppi))



Массивы (векторы)

 

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}};

 

char vls2[]="2nd very long"

            " string.\n";

 

fox=&fox[0][0]

 

sizeof

 

 

Структуры

 

struct Student

{

  char FirstName[20];

  char SecondName[20];

  char SurnameName[20];

  int Age,Year;

  char Dept[20];

};

 

Student St1;

Student i81[31];

 

St1.FirstName[]=”Name”;

 

Student *R32; // Указатель

 

R32 – адрес объекта

*R32 – сам объект

(*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};

struct A {struct B *pb};

 

struct a1

{ ...

  int oscar;

};

struct a2

{ ...

  a1 lima;

}tango;

 

//...

 

tango.lima.oscar=256;


Функции

 

Прототип

 

void func1(int j,float* f);

void func1(int,float*);

 

double func2();

double func2(void); // вар.

 

int func3(int x,...);

 

Стандартные значения

аргументов (по умолчанию)

 

void DrawCircle(int x=100, int y=100,int r=100);

 

void DrawCircle(int=100, int=100,int=100);

 

void DrawCircle(int x,int     y=100,int r); // Ошибка

 

DrawCircle();  // Вызов

DrawCircle(200);

DrawCircle(200,300);

DrawCircle(,,400); //Ошибка

 

Определение функции

 

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;

}

Вызов функции

 

int a=10,b=15,c;

c=Max(a,b);

c=Max(9,10);

 

Передача аргументов

 

#include <iostream.h>

void swap1(int x,int y)

{

  int z=y;

  y=x; x=z;

}

void main()

{

  int a=5,b=10;

  swap1(a,b);

  cout<<a<<’ ’<<b<<endl;

// a=5, b=10

}

 

void swap2(int& x,int& y)

{

  int z=y;

  y=x; x=z;

}

//...

  swap2(a,b)

// a=10, b=5

 

void Show(Student& st);

 

char* GetName(const

  Student& st)

{

  return st.FirstName;

}

 

 

 

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

 

inline int HiWord(long L)

{

  return (int)(L>>16);

}

 

if, while, for, switch,

goto

 

 


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)

 

a[5] – массив

a – имя массива

y=&a[0] – адрес 0-го эл-та

a - адрес 0-го элемента

x0 – содерж. 0-го эл-та

 

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)

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  2). p++

 

int i1=10,i2=20,i3=30;

int *p=&i2;

 

i3

i2

i1

30

20

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

10

 

++&i2; //Ошибка–не L-выражение

--&i2++; // То же самое

 

Массивы указателей

 

int *arp[20];

int* arp[20]; //Массив ук.

 

char* month1[]={”январь”,

”февраль”,”март”};

 

char month2[][10]={...};

 

 

Составные описатели

 

«изнутри - наружу»

 

char *(*(*var)())[10];

  7  6 4 2 1  3  5

 

1. Идентификатор var – это

2. указатель на

3. функцию, возвращающую

4. указатель на

5. массив из 10

6. указателей на

7. значения типа char.

 

int *arp[5]; –массив указ.

int (*par)[5]; - указатель на массив.

long *fp(); - функция, возвр. указатель.

long (*pf)(); - указатель на функцию, возвр. значение типа long.

float (*f1())[3]; - функц.

 

struct Student{};

Student& (*AS[5])(); - массив указ. на функции, возвр. ссылки на структ. тип Student.

 

Преобразование типов указателей

 

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; // Ошибка.