03 Constants And Variables

667 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
667
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

03 Constants And Variables

  1. 1. Бублик Володимир Васильович Програмування - 2 Лекція 3. Базові поняття програмування. Сталі та змінні Лекції для студентів 2 курсу
  2. 2. Літерали <ul><li>Літерал (з латинського literal — буквальний) — це найпростіший об’єкт, що позначає сам себе. </li></ul><ul><li>Цілі літерали </li></ul><ul><li>100 //десятковий запис </li></ul><ul><li>0144 //вісімковий ( o ctal ) </li></ul><ul><li>0х64 //шістнадцятковий ( hexadecimal , he x ) </li></ul><ul><li>Вісімковими і шістнадцятковими константами варто користуватися лише для типів без знаку, інакше на комп’ютерах з доповняльним кодом можна зіткнутися із несподіванками типу значення –1 для константи 0xffffffff </li></ul>
  3. 3. Літерали <ul><li>Уточнення типу числового літералу </li></ul><ul><li>U, L або UL </li></ul><ul><li>2147483648U </li></ul><ul><li>2147483648L </li></ul><ul><li>2147483648UL </li></ul><ul><li>F або L </li></ul><ul><li>1.0F </li></ul><ul><li>3.1415926535897932 L </li></ul>
  4. 4. Літерали <ul><li>Символьні літерали </li></ul><ul><li>// звичайні символи </li></ul><ul><li>’ ?’, ’f’, ’ї’ </li></ul>
  5. 5. Літерали <ul><li>Символьні літерали </li></ul><ul><li>// вісімкові коди </li></ul><ul><li>’ 77’ // символ ’?’ </li></ul><ul><li>’ 144’ // символ ’f’ </li></ul><ul><li>’ 365’ // символ ’ї’ ( з точністю до кодової таблиці ) </li></ul><ul><li>’ 11’ // символ табуляції </li></ul><ul><li>’ 12’ // символ нового рядка </li></ul><ul><li>’ 14’ // символ нової сторінки </li></ul>
  6. 6. Літерали <ul><li>Символьні літерали </li></ul><ul><li>// шістнадцяткові коди </li></ul><ul><li>’ x3f’ // символ ’?’ </li></ul><ul><li>’ x66’ // символ ’f’ </li></ul><ul><li>’ x10’ // символ нового рядка </li></ul>
  7. 7. Літерали <ul><li>Символьні літерали </li></ul><ul><li>// службові символи </li></ul><ul><li>’ ’ // символ табуляції </li></ul><ul><li>’ ’ // символ нового рядка </li></ul><ul><li>’ f’ // символ нової сторінки </li></ul><ul><li>Як бачимо, деякі з символів можна записати різними рівносильними способами: </li></ul><ul><li>’ x10’, ’12’ і ’ ’ </li></ul><ul><li>’ f’, ’144’ і ’x66’ </li></ul>
  8. 8. Літерали <ul><li>Багатосимвольні літерали (рядки) </li></ul><ul><li>” A” // послідовність, складена з ’A’ і ’’ </li></ul><ul><li>″ Це константа, складена із символів″ </li></ul><ul><li>” This is another string” </li></ul><ul><li>” Наступний рядок містить службові символи” </li></ul><ul><li>” №п/п Назва Кількість ” </li></ul><ul><li>Виведеться як </li></ul><ul><li>№ п/п Назва Кількість </li></ul>
  9. 9. Літерали vs. Іменовані об'єкти <ul><li>Літерали не потребують визначення, бо позначають самі себе, а запис літералу однозначно визначає його тип. </li></ul><ul><li>Іменовані об'єкти вимагають попереднього визначення (створення) або оголошення . </li></ul><ul><li>Визначення і оголошення визначають ім'я і тип об'єкту. </li></ul><ul><li>Визначення приводить до створення об'єкту в пам'яті , тоді як оголошення посилається на об'єкт, створений в іншому місці. </li></ul><ul><li>Визначення звичайно суміщують з ініціалізацією. </li></ul>
  10. 10. Визначення сталих <ul><li>const float pi = 3.14159; </li></ul><ul><li>const float Avogadro =6.02252e23; </li></ul><ul><li>const double dpi = 3.141592653589793; </li></ul><ul><li>const char tab = ‘ ’; </li></ul><ul><li>const char title[] = ”C++ Programming Language”; </li></ul><ul><li>const int sample; // сталу необхідно визначити! </li></ul><ul><li>const int sample = 1756; sample = 456; </li></ul><ul><li>// значення сталої не можна змінити! </li></ul>
  11. 11. Визначення змінних <ul><li>int i= 1 , j= 1 , k= 1 ; // добре </li></ul><ul><li>unsinged long counter= 0 ; // змінні корисно ініціювати </li></ul><ul><li>double a = 0.0 , b= 1.0 ; </li></ul><ul><li>double eps = 0.000001 ; </li></ul><ul><li>double x; //визначення з наступним присвоєнням </li></ul><ul><li>x = 0; //чому не ініціалізація double x = 0; ? </li></ul><ul><li>double x; //не годиться! Перше присвоєння надто </li></ul><ul><li>………… .. </li></ul><ul><li>x = 0; // далеко від визначення </li></ul>
  12. 12. Розміщення в пам'яті
  13. 13. Арифметичне присвоєння <ul><li>x = e; де x – іменуючий вираз, e – арифметичний вираз </li></ul><ul><li>Обчислити lvalue (x) </li></ul><ul><li>Обчислити rvalue (e) </li></ul><ul><li>Переслати rvalue (e) до lvalue (x) </li></ul><ul><li>Значенням виразу x = e вважати нове значення value (x) </li></ul><ul><li>Яке з них lvalue чи rvalue ? ― Залежно від контексту </li></ul>
  14. 14. Приклад арифметичного присвоєння <ul><li>x = y; </li></ul><ul><li>lvalue (x) </li></ul>
  15. 15. Приклад арифметичного присвоєння <ul><li>x = y; </li></ul><ul><li>rvalue (y) </li></ul>
  16. 16. Приклад арифметичного присвоєння <ul><li>x = y; </li></ul><ul><li>Переслати </li></ul>
  17. 17. Приклади присвоєнь <ul><li>s = pi * r * r; </li></ul><ul><li>i = j+k; </li></ul><ul><li>Суміщене присвоєння </li></ul><ul><li>i += k; // i = i+k </li></ul><ul><li>i >>= k; // i = i>>k </li></ul><ul><li>Інкремент (декремент) </li></ul><ul><li>постфіксний </li></ul><ul><li>// нехай k==1 </li></ul><ul><li>j=k++ //j=k; k=k+1; </li></ul><ul><li>// j==1; k==2 </li></ul><ul><li>(i=++(j=++k))++ ; ??? </li></ul><ul><li>префіксний </li></ul><ul><li>// нехай k==1 </li></ul><ul><li>j=++k //k=k+1; j=k; </li></ul><ul><li>// j==2; k==2 </li></ul>
  18. 18. Композиція присвоєнь <ul><li>u = v = w; читається як u = ( v = w ) ; </li></ul><ul><li>rvalue (w) ―› lvalue (v) </li></ul><ul><li>rvalue (v) ―› lvalue (u) </li></ul><ul><li>(u = v) = w; </li></ul><ul><li>rvalue (v) ―› lvalue (u) </li></ul><ul><li>rvalue (w) ―› lvalue (u) // що б це значило? </li></ul>
  19. 19. Зведення типів <ul><li>1. С (старомодне) </li></ul><ul><li>week ―› int </li></ul><ul><li>int (monday) або (int) Monday </li></ul><ul><li>int ―› week </li></ul><ul><li>(week) i </li></ul><ul><li>2. С++ (новітнє) </li></ul><ul><li>const_cast, dynamic_cast, static_cast </li></ul><ul><li>y = static_cast<double>( x ); </li></ul><ul><li>Дуже обережно! Може з'явитися багато проблем </li></ul>
  20. 20. Указник ( pointer) <ul><li>int * ptrI; </li></ul><ul><li>float *px, y, z; </li></ul><ul><li>float *px, *py, *pz; </li></ul><ul><li>Визначення без ініціалізації приводять до заповнення пам'яті сміттям. Засмічені указники ( dangling pointer) небезпечні ! </li></ul><ul><li>float x, *px; </li></ul>сміття сміття некоректні дані некоректна адреса
  21. 21. Pointer vs. goto <ul><li>Указники приводять до тих же проблем в структурах даних, до яких приводять оператори переходу в структурах керування. </li></ul><ul><li>Скрізь, де можна, уникаємо указників. Якщо вживаємо, то дотримуємось суворої дисципліни! </li></ul><ul><li>Якщо значення указника невідоме, ініціалізуємо його нулем </li></ul><ul><li>float *px = 0; </li></ul><ul><li>Якщо значення указника не нуль, то з ним зв'язані два елементи пам'яті! </li></ul>
  22. 22. Адресування і розіменування <ul><li>x=0.25; px = & x; </li></ul><ul><li>& одномісна операція адресування </li></ul><ul><li>lvalue(px) </li></ul><ul><li>rvalue(px) == lvalue (x) == rvalue(&x) </li></ul>
  23. 23. Адресування і розіменування <ul><li>Взаємна оберненість операцій над пам'яттю </li></ul><ul><li>&(*px) == px </li></ul><ul><li>px == *(&px) </li></ul>
  24. 24. Адресування і розіменування <ul><li>cout<< * px; </li></ul><ul><li>* одномісна операція розіменування </li></ul><ul><li>rvalue(px) == lvalue(x) </li></ul><ul><li>rvalue(*px) == rvalue(x) </li></ul>
  25. 25. Динамічне виділення пам'яті <ul><li>float *p = new float; </li></ul><ul><li>new операція виділення нового елемента пам'яті, його адреса зберігається в p, значення *p заповнено сміттям </li></ul><ul><li>px = new float; </li></ul><ul><li>if (px == 0) // вільної пам’яті немає </li></ul>сміття
  26. 26. Динамічне виділення і ініціалізація пам'яті <ul><li>float *p = new float(0.333333); </li></ul><ul><li>Тепер значення *p коректне </li></ul>
  27. 27. Правило гарного тону <ul><li>Якщо ви виділили динамічну пам’ять за допомогою команди new не забудьте своєчасно звільнити її командою delete та обнулити указник </li></ul><ul><li>float *p = new float(0.333333); </li></ul><ul><li>// робіть все, що вам потрібно </li></ul><ul><li>delete p; </li></ul><ul><li>p = 0 ; </li></ul>
  28. 28. Звільнення памяті <ul><li>double *pd = new double(5.2); </li></ul><ul><li>cout<<pd<<endl; // 0 x00 4419 B0 </li></ul><ul><li>cout<<*pd<<endl; //5.2 </li></ul><ul><li>delete pd; </li></ul><ul><li>cout<<pd<<endl; // 0 x00 4419 B0 </li></ul><ul><li>cout<<*pd<<endl; //-1.45682e+144 </li></ul><ul><li>double *n ew_ pd = new double; </li></ul><ul><li>cout<<n ew_ pd<<endl; // 0 x00 4419 B0 </li></ul><ul><li>cout<<*pd<<endl; //-6.27744t+066 </li></ul><ul><li>cout<<*n ew_ pd<<endl; </li></ul>
  29. 29. Звільнення памяті <ul><li>double *pd = new double(5.2); </li></ul><ul><li>cout<<pd<<endl; // 0 x00 4419 B0 </li></ul><ul><li>cout<<*pd<<endl; //5.2 </li></ul><ul><li>delete pd; </li></ul><ul><li>// Правило гарного тону </li></ul><ul><li>pd = 0; </li></ul>
  30. 30. Сталі величини і указники <ul><li>Указник сталої </li></ul><ul><li>const float pi = 3.14159; </li></ul><ul><li>const float *piPtr = &pi ; </li></ul><ul><li>//*piPtr = 4; ERROR! </li></ul>
  31. 31. Сталі величини і указники <ul><li>float x = 1; </li></ul><ul><li>const float* px = &x; </li></ul><ul><li>x =3; </li></ul><ul><li>cout<<*px<<endl; </li></ul><ul><li>//*px = 4; як і раніше ERROR! </li></ul><ul><li>Указник сталої не має права змінити об'єкт, але безпосередня зміна об'єкту, якщо він не сталий можлива </li></ul>
  32. 32. Сталі величини і указники <ul><li>Сталий указник </li></ul><ul><li>float x = 0.25; </li></ul><ul><li>float *const px = &x ; </li></ul><ul><li>//px = &y; ERROR! </li></ul>
  33. 33. Сталі величини і указники <ul><li>Сталий указник сталої </li></ul><ul><li>const float pi = 3.14159; </li></ul><ul><li>const float *const piPtr = &pi ; </li></ul><ul><li>//*piPtr = 4; ERROR! </li></ul><ul><li>//piPtr = &nAvogadro; ERROR! </li></ul>
  34. 34. Безтипові указники <ul><li>void *voidPtr; //Що б це значило? </li></ul>voidPtr char * str “ abcdefghij” 00 A0 69 68 67 66 65 64 63 62 61 0 A
  35. 35. Безтипові указники <ul><li>void *voidPtr; //Що б це значило? </li></ul>voidPtr Якби це був Бейсик “ abcdefghij” 00 A0 69 68 67 66 65 64 63 62 61 0 A
  36. 36. Безтипові указники <ul><li>void *voidPtr; //Що б це значило? </li></ul>voidPtr short int * i 24842 A0 00 69 68 67 66 65 64 63 62 61 0 A
  37. 37. Безтипові указники <ul><li>void *voidPtr; //Що б це значило? </li></ul>voidPtr float * x 4.17596e+021 A0 00 69 68 67 66 65 64 63 62 61 0 A
  38. 38. Безтипові указники <ul><li>void *voidPtr; //Що б це значило? </li></ul>voidPtr int * k 1667391754 A0 00 69 68 67 66 65 64 63 62 61 0 A
  39. 39. Безтипові указники <ul><li>void *voidPtr; //Що б це значило? </li></ul><ul><li>float *pf = new float(3.1); </li></ul><ul><li>double *pd = new double(5.2); </li></ul><ul><li>voidPtr = pf; </li></ul><ul><li>cout<<voidPtr<<endl; </li></ul><ul><li>// 0 x00 4419 F0 </li></ul><ul><li>// cout<<*voidPtr<<endl; розіменування неможливе </li></ul><ul><li>voidPtr = pd; </li></ul><ul><li>cout<<voidPtr<<endl; </li></ul><ul><li>// 0 x00 4419 B0 </li></ul>
  40. 40. Символьний указник <ul><li>char *c = new char; </li></ul><ul><li>cout<<*c<<endl; </li></ul><ul><li>char *cc = new char('a'); </li></ul><ul><li>cout<<*cc<<endl; </li></ul><ul><li>// char *str = new char(“String?“); </li></ul><ul><li>char *str = &quot;Operation New is not needed&quot;; </li></ul><ul><li>cout<<str<<endl; </li></ul>
  41. 41. Операцій над указниками <ul><li>float *p1=new float(1), *p2=new float(2); </li></ul><ul><li>cout<<p2; //0x004418F0 </li></ul><ul><li>Порівняння на рівність або нерівність p1 == p2; p1 > p2;… if(p2>p1) cout<<&quot;p2>p1&quot;<<endl; else cout<<&quot;p1>p2&quot;<<endl; </li></ul><ul><li>Присвоєння p1 = p2; p1 =&x; p1 = new float(3); char *pc = new char [ 100 ] ; </li></ul><ul><li>Збільшення, зменшення p1++; ++p1; p1--;--p1; p1+10; p1-10; cout<<p2+1; //0x004418F4 </li></ul>
  42. 42. Відсилка (псевдонім) ( reference ) <ul><li>Відсилка або псевдонім — це альтернативне ім’я об’єкта, яке позначає об’єкт на рівних правах з його основним іменем. </li></ul><ul><li>При створенні псевдонім зв'язується зі своїм об'єктом (відсилає до нього) і ця відсилка дійсна протягом усього життя псевдоніму. </li></ul><ul><li>Для чого? Для того, щоб у різних частинах програми іменувати одну й ту ж область пам'яті зручним і зрозумілим для цієї частини іменем </li></ul>
  43. 43. Відсилка (псевдонім) ( reference ) <ul><li>float x = 1.024; //визначення змінної х </li></ul><ul><li>float &xRef = x; //визначення її псевдоніму </li></ul><ul><li>xRef *= 2; // x == xRef == 2.048 </li></ul>
  44. 44. Копіювання <ul><li>float x = 1,024; //визначення змінної x </li></ul><ul><li>float xCopy = x; //визначення її копії </li></ul><ul><li>xCopy += x; //подвоєння xCopy, x незмінний </li></ul>
  45. 45. Відсилка і указник <ul><li>float x = 1,024; //визначення змінної х </li></ul><ul><li>float *px = &x; //визначення указника на неї </li></ul>
  46. 46. Відсилка і указник <ul><li>px = new float(3.33333); </li></ul><ul><li>// x == 1,024; *px == 3.33333 </li></ul><ul><li>//Зв’язок між px і x розірвано </li></ul>
  47. 47. Відсилка і указник <ul><li>Указнику p відповідає два елементи пам'яті, кожен з яких має власне значення. </li></ul><ul><li>Зміна значення p розриває наявний зв’язок між елементами пам'яті , наприклад, px = 0; </li></ul>
  48. 48. Відсилка і сталий указник <ul><li>float x = 1.024; //визначення змінної х </li></ul><ul><li>float *const px = &x; //сталий указник на неї </li></ul><ul><li>//схожість: зв’язок нерозривний </li></ul><ul><li>//відмінність: наявність двох елементів пам'яті </li></ul>
  49. 49. Стала відсилка <ul><li>const float pi = 3.14159; </li></ul><ul><li>const float &piRef = pi; </li></ul>
  50. 50. Стала відсилка <ul><li>Що б це значило? </li></ul><ul><li>float x = 1; </li></ul><ul><li>const float& rx = x; </li></ul><ul><li>x =2; </li></ul><ul><li>cout<<rx<<endl; </li></ul><ul><li>Якщо псевдонім сталий, то він не має права змінити об'єкт, але безпосередня зміна об'єкту, якщо він не сталий можлива </li></ul>
  51. 51. Указники указників <ul><li>double **ppd = new double*; </li></ul><ul><li>*ppd = new double(5); </li></ul><ul><li>cout<<ppd<<endl; </li></ul><ul><li>cout<<*ppd<<endl; </li></ul><ul><li>cout<<**ppd<<endl; </li></ul><ul><li>Використання указників на указники ― р озповсюджена техніка програмування у “чистому” С. Проблеми управління пам'яттю при цьому зростають, бо необхідно слідкувати за обома поверхами указника. Вживати ще обережніше, ніж звичайні. </li></ul>

×