Алфавит языка Си++ включает:
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
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=π
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; // Ошибка.