03 Constants And Variables

51
Бублик Володимир Васильович Програмування - 2 Лекція 3. Базові поняття програмування. Сталі та змінні Лекції для студентів 2 курсу

Transcript of 03 Constants And Variables

Page 1: 03 Constants And Variables

Бублик Володимир Васильович

Програмування - 2

Лекція 3. Базові поняття програмування.Сталі та змінні

Лекції для студентів 2 курсу

Page 2: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

2

Літерали

Літерал (з латинського literal — буквальний) — це найпростіший об’єкт, що позначає сам себе.

Цілі літерали• 100 //десятковий запис• 0144 //вісімковий (octal)• 0х64 //шістнадцятковий (hexadecimal, hex)Вісімковими і шістнадцятковими константами

варто користуватися лише для типів без знаку, інакше на комп’ютерах з доповняльним кодом можна зіткнутися із несподіванками типу значення –1 для константи 0xffffffff

Page 3: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

3

Літерали

Уточнення типу числового літералу

• U, L або UL• 2147483648U• 2147483648L • 2147483648UL• F або L• 1.0F• 3.1415926535897932L

Page 4: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

4

Літерали

• Символьні літерали

• // звичайні символи• ’?’, ’f’, ’ї’

Page 5: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

5

Літерали

• Символьні літерали

• // вісімкові коди • ’\77’ // символ ’?’• ’\144’ // символ ’f’• ’\365’ // символ ’ї’ (з точністю до кодової таблиці)• ’\11’ // символ табуляції• ’\12’ // символ нового рядка• ’\14’ // символ нової сторінки

Page 6: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

6

Літерали

• Символьні літерали

• // шістнадцяткові коди • ’\x3f’ // символ ’?’• ’\x66’ // символ ’f’• ’\x10’ // символ нового рядка

Page 7: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

7

Літерали

• Символьні літерали

• // службові символи• ’\t’ // символ табуляції• ’\n’ // символ нового рядка• ’\f’ // символ нової сторінки

Як бачимо, деякі з символів можна записати різними рівносильними способами:

• ’\x10’, ’\12’ і ’\n’ • ’f’, ’\144’ і ’\x66’

Page 8: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

8

Літерали

Багатосимвольні літерали (рядки)• ”A” // послідовність, складена з ’A’ і ’\0’• ″Це константа, складена із символів″• ”This is another string”• ”Наступний рядок містить службові символи”• ”\n№п/п\tНазва\tКількість\n”

• Виведеться як

• №п/п Назва Кількість

Page 9: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

9

Літерали vs. Іменовані об'єкти

Літерали не потребують визначення, бо позначають самі себе, а запис літералу однозначно визначає його тип.

Іменовані об'єкти вимагають попередньоговизначення (створення) або оголошення.

Визначення і оголошення визначають ім'я і тип об'єкту.

Визначення приводить до створення об'єкту в пам'яті, тоді як оголошення посилається на об'єкт, створений в іншому місці.

Визначення звичайно суміщують з ініціалізацією.

Page 10: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

10

Визначення сталих

• const float pi = 3.14159;• const float Avogadro =6.02252e23;• const double dpi = 3.141592653589793;• const char tab = ‘\t’;• const char title[] = ”C++ Programming Language”;

• const int sample; //сталу необхідно визначити!

• const int sample = 1756; sample = 456;

• //значення сталої не можна змінити!

Page 11: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

11

Визначення змінних

• int i=1, j=1, k=1; //добре• unsinged long counter=0; //змінні корисно

ініціювати• double a =0.0, b=1.0;• double eps = 0.000001;

• double x; //визначення з наступним присвоєнням• x = 0; //чому не ініціалізація double x = 0; ?

• double x; //не годиться! Перше присвоєння надто • …………..• x = 0; //далеко від визначення

Page 12: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

12

Розміщення в пам'яті

Page 13: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

13

Арифметичне присвоєння

• x = e;де x – іменуючий вираз, e – арифметичний вираз

1. Обчислити lvalue (x)2. Обчислити rvalue (e)3. Переслати rvalue (e) до lvalue (x)4. Значенням виразу x = e вважати нове значення

value (x)Яке з них lvalue чи rvalue? ― Залежно від контексту

Page 14: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

14

Приклад арифметичного присвоєння

x = y;1. lvalue (x)

Page 15: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

15

Приклад арифметичного присвоєння

x = y;2. rvalue (y)

Page 16: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

16

Приклад арифметичного присвоєння

x = y;2. Переслати

Page 17: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

17

Приклади присвоєнь

• s = pi * r * r;• i = j+k;• Суміщене присвоєння• i += k;// i = i+k• i >>= k; // i = i>>k

• Інкремент (декремент)

• постфіксний• // нехай k==1• j=k++ //j=k; k=k+1;• // j==1; k==2• (i=++(j=++k))++ ; ???

• префіксний• // нехай k==1• j=++k //k=k+1; j=k;• // j==2; k==2

Page 18: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

18

Композиція присвоєнь

u = v = w; читається як u = (v = w);rvalue (w) ―› lvalue (v)rvalue (v) ―› lvalue (u)

(u = v) = w;rvalue (v) ―› lvalue (u)rvalue (w) ―› lvalue (u) //що б це значило?

Page 19: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

19

Зведення типів

1. С (старомодне)week ―› int• int (monday) або (int) Mondayint ―› week• (week) i 2. С++ (новітнє)const_cast, dynamic_cast, static_cast

y = static_cast<double>(x);

Дуже обережно! Може з'явитися багато проблем

Page 20: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

20

Указник (pointer)

1. int *ptrI;2. float *px, y, z;3. float *px, *py, *pz;

Визначення без ініціалізації приводять до заповнення пам'яті сміттям. Засмічені указники (dangling pointer) небезпечні!

float x, *px;

сміття сміття

некоректні дані некоректна адреса

Page 21: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

21

Pointer vs. goto

Указники приводять до тих же проблем в структурах даних, до яких приводять оператори переходу в структурах керування.

Скрізь, де можна, уникаємо указників. Якщо вживаємо, то дотримуємось суворої дисципліни!

Якщо значення указника невідоме, ініціалізуємо його нулем

float *px = 0;Якщо значення указника не нуль, то з ним зв'язані

два елементи пам'яті!

Page 22: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

22

Адресування і розіменування

• x=0.25; px = &x;

• & одномісна операція адресування

lvalue(px)

rvalue(px) == lvalue (x) == rvalue(&x)

Page 23: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

23

Адресування і розіменування

• Взаємна оберненість операцій над пам'яттю

• &(*px) == px• px == *(&px)

Page 24: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

24

Адресування і розіменування

• cout<< *px;

• * одномісна операція розіменування

rvalue(px) == lvalue(x)

rvalue(*px) == rvalue(x)

Page 25: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

25

Динамічне виділення пам'яті

• float *p = new float;

• new операція виділення нового елемента пам'яті, його адреса зберігається в p, значення *p заповнено сміттям

• px = new float;• if (px == 0)// вільної пам’яті немає

сміття

Page 26: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

26

Динамічне виділення і ініціалізація пам'яті

• float *p = new float(0.333333);

• Тепер значення *p коректне

Page 27: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

27

Правило гарного тону

• Якщо ви виділили динамічну пам’ять за допомогою команди new не забудьте своєчасно звільнити її командою delete та обнулити указник

• float *p = new float(0.333333);• // робіть все, що вам потрібно• delete p;• p = 0;

Page 28: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

28

Звільнення памяті

• double *pd = new double(5.2);• cout<<pd<<endl; // 0x004419B0 • cout<<*pd<<endl; //5.2• delete pd;• cout<<pd<<endl; // 0x004419B0• cout<<*pd<<endl; //-1.45682e+144

• double *new_pd = new double;• cout<<new_pd<<endl; // 0x004419B0• cout<<*pd<<endl; //-6.27744t+066• cout<<*new_pd<<endl;

Page 29: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

29

Звільнення памяті

• double *pd = new double(5.2);• cout<<pd<<endl; // 0x004419B0

• cout<<*pd<<endl; //5.2• delete pd;• // Правило гарного тону• pd = 0;

Page 30: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

30

Сталі величини і указники

• Указник сталої • const float pi = 3.14159;• const float *piPtr = &pi ;• //*piPtr = 4; ERROR!

Page 31: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

31

Сталі величини і указники

• float x = 1;• const float* px = &x;• x =3;• cout<<*px<<endl;• //*px = 4; як і раніше ERROR!

Указник сталої не має права змінити об'єкт, але безпосередня зміна об'єкту, якщо він не сталий можлива

Page 32: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

32

Сталі величини і указники

• Сталий указник• float x = 0.25;• float *const px = &x;• //px = &y; ERROR!

Page 33: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

33

Сталі величини і указники

• Сталий указник сталої • const float pi = 3.14159;• const float *const piPtr = &pi;• //*piPtr = 4; ERROR!• //piPtr = &nAvogadro; ERROR!

Page 34: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

34

Безтипові указники

• void *voidPtr; //Що б це значило?

0A 61 62 63 64 65 66 67 68 69 A0 00

voidPtr

char * str

“\nabcdefghij”

Page 35: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

35

Безтипові указники

• void *voidPtr; //Що б це значило?

0A 61 62 63 64 65 66 67 68 69 A0 00

voidPtr

Якби це був Бейсик

“abcdefghij”

Page 36: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

36

Безтипові указники

• void *voidPtr; //Що б це значило?

0A 61 62 63 64 65 66 67 68 69 A0 00

voidPtr

short int * i

24842

Page 37: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

37

Безтипові указники

• void *voidPtr; //Що б це значило?

0A 61 62 63 64 65 66 67 68 69 A0 00

voidPtr

float * x

4.17596e+021

Page 38: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

38

Безтипові указники

• void *voidPtr; //Що б це значило?

0A 61 62 63 64 65 66 67 68 69 A0 00

voidPtr

int * k

1667391754

Page 39: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

39

Безтипові указники

• void *voidPtr; //Що б це значило?• float *pf = new float(3.1);• double *pd = new double(5.2);

• voidPtr = pf;• cout<<voidPtr<<endl;• // 0x004419F0• // cout<<*voidPtr<<endl; розіменування

неможливе• voidPtr = pd;• cout<<voidPtr<<endl;• // 0x004419B0

Page 40: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

40

Символьний указник

• char *c = new char;• cout<<*c<<endl;

• char *cc = new char('a');• cout<<*cc<<endl;

• // char *str = new char(“String?“);

• char *str = "Operation New is not needed";• cout<<str<<endl;

Page 41: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

41

Операцій над указниками

float *p1=new float(1), *p2=new float(2);cout<<p2; //0x004418F01. Порівняння на рівність або нерівність

p1 == p2; p1 > p2;…if(p2>p1) cout<<"p2>p1"<<endl;

else cout<<"p1>p2"<<endl;2. Присвоєння

p1 = p2; p1 =&x; p1 = new float(3);char *pc = new char[100];

3. Збільшення, зменшенняp1++; ++p1; p1--;--p1; p1+10; p1-10;cout<<p2+1; //0x004418F4

Page 42: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

42

Відсилка (псевдонім) (reference)

Відсилка або псевдонім — це альтернативне ім’я об’єкта, яке позначає об’єкт на рівних правах з його основним іменем.

При створенні псевдонім зв'язується зі своїм об'єктом (відсилає до нього) і ця відсилка дійсна протягом усього життя псевдоніму.

Для чого? Для того, щоб у різних частинах програми іменувати одну й ту ж область пам'яті зручним і зрозумілим для цієї частини іменем

Page 43: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

43

Відсилка (псевдонім) (reference)

• float x = 1.024; //визначення змінної х• float &xRef = x; //визначення її псевдоніму

• xRef *= 2; // x == xRef == 2.048

Page 44: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

44

Копіювання

• float x = 1,024; //визначення змінної x• float xCopy = x; //визначення її копії

• xCopy += x; //подвоєння xCopy, x незмінний

Page 45: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

45

Відсилка і указник

• float x = 1,024; //визначення змінної х• float *px = &x; //визначення указника на неї

Page 46: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

46

Відсилка і указник

• px = new float(3.33333);• // x == 1,024; *px == 3.33333• //Зв’язок між px і x розірвано

Page 47: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

47

Відсилка і указник

• Указнику p відповідає два елементи пам'яті, кожен з яких має власне значення.

• Зміна значення p розриває наявний зв’язок між елементами пам'яті, наприклад, px = 0;

Page 48: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

48

Відсилка і сталий указник

• float x = 1.024; //визначення змінної х• float *const px = &x; //сталий указник на неї• //схожість: зв’язок нерозривний• //відмінність: наявність двох елементів пам'яті

Page 49: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

49

Стала відсилка

• const float pi = 3.14159;• const float &piRef = pi;

Page 50: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

50

Стала відсилка

Що б це значило?

• float x = 1;• const float& rx = x;• x =2;• cout<<rx<<endl;

Якщо псевдонім сталий, то він не має права змінити об'єкт, але безпосередня зміна об'єкту, якщо він не сталий можлива

Page 51: 03 Constants And Variables

© Бублик В.В. Програмування-2. 3. Базові поняття програмування. Сталі та змінні

51

Указники указників

• double **ppd = new double*;• *ppd = new double(5);• cout<<ppd<<endl;• cout<<*ppd<<endl;• cout<<**ppd<<endl;

Використання указників на указники ― розповсюджена техніка програмування у “чистому” С. Проблеми управління пам'яттю при цьому зростають, бо необхідно слідкувати за обома поверхами указника. Вживати ще обережніше, ніж звичайні.