Lecture2-CPP.ppt
- Количество слайдов: 33
Типи даних. Ініціалізація змінних Проф. Куссуль Н. М. 1
Вступ Кожне ім'я (ідентифікатор) в C++ програмі має асоційований з ним тип даних Цей тип визначає, які операції можна застосовувати до імені (тобто до об'єкта, на який воно посилається), і як ці операції інтерпретуються 2
Приклад. Неосмислений вираз Розглянемо вираз y = x + f(t) Вираз буде мати сенс тоді, коли імена y, x, t і функція f(t) будуть оголошені, тобто для них повинні бути визначені операції “ = ”, “+” і функція f(t) 3
Типи даних – вбудовані типи Вбудовані типи n це типи, які підтримує мова програмування Вбудовані типи бувають n n прості (базові) та похідні, які утворюються від базових 4
Типи даних в С++ До простих типів відносяться n n n bool int char float double До похідних типів відносяться n n масиви (int a[5]) вказівники (int*a) Існує також порожній тип void (не має значення). Прості типи мають набір значень і представлень, прив'язаних до архітектури машини, на якій працює транслятор 5
Модифікатори У С++ прості типи можуть бути модернізовані за допомогою ключових слів: n n short long signed unsigned 6
Користувацькі типи Крім вбудованих типів у С++ існують користувацькі типи, які вимагають попереднього оголошення. Вони зазвичай складені n n структура (struct) об'єднання (union) перерахування (enum) класи (сlass) 7
Характеристики основних типів даних мови С++ Тип Розмір пам'яті, байтів Діапазон значень для 16 розрядної архітектури [signed] char unsigned char [signed] short [int] unsigned short [int] 1 1 -128 0 127 255 2 -32768 32767 2 0 65535 [signed] int машинне слово -32768 32767 unsigned int машинне слово 0 65535 4 -2147483648 2147483647 4 0 4294967295 4 3. 4 e-38 3. 4 e 38 8 1. 7 e-308 1. 7 e 308 [signed] long [int] [unsigned] long [int] float double 8
Розмір об’єктів Для визначення розміру об'єкту в одиницях (найчастіше в байтах) використовується оператор sizeof: n cout << sizeof(int); Діапазони всіх типів змінних (максимальні й мінімальні значення) можна одержати з заголовочного файлі climits ( в більш ранніх реалізаціях ‑ limits. h) 9
Приклад. Осмислений вираз Повертаючись до першого прикладу, y = x + f(t) необхідно оголосити: n n n float y; int x = 7; // ініціалізація float f(int); Приклад став осмисленим! 10
Тип bool Логічний тип bool має два значення: n n true (1) false (0) Цей тип використовується для представлення результатів логічних операцій Приклад n n n bool b 1=a==b // якщо a=b, b 1=true, інакше b 1=false bool b=7; // b=true int i=true; // i=1 Тип bool можна перетворити в тип int і навпаки В арифметичних і логічних виразах логічні змінні перетворюються в цілі, і над ними виконуються операції 11
Тип сhar Символьний тип сhar майже завжди займає 1 байт (знаковий або беззнаковий залежить від реалізації) Кожна символьна константа має числове значення. Приклад n n char c = ‘a’; cin >> c; Символьні типи є інтегральними. До них можна застосувати арифметичні й логічні операції, в них можна зберігати числові значення 12
Тип int Цілий тип int за замовчуванням є знаковим int=signed int Тип int залежить від реалізації, тому цілі літерали краще записувати в десятковій формі (8 -ва й 16 -ва форми можуть призвести до неявного «сюрпризу» ) n Приклад n n int a = 545; 0 хffff = 65535 // на 32 розрядному комп'ютері 13
Типи із плаваючою точкою n n n float - oдинарної точності double - подвійної точності long double - розширеної точності Приклад. Літерали із плаваючою точкою: n n -0. 457 1. 23 е-15 1. 2 е 10 14
Тип void (порожній) синтаксично поводиться як основний тип Однак використати його можна тільки як частину похідного типу, об'єктів типу void не існує Він використовується для того, щоб вказати, що функція не повертає значення, або як базовий тип для вказівників на об'єкти невідомого типу Приклад n n n void f(); //функція не повертає значення void * p; //вказівник на об'єкт невідомого типу void a; //помилка 15
Перетворення типів від одного до іншого відбувається присвоюванні і в змішаних виразах n float d=3; //дані типу int перетворюються в тип float В змішаних виразах відбувається два види автоматичних перетворень типів: n n 1) типи bool, char, unsigned char, short перетворюються в тип int 2) якщо після першого кроку вираз має змішаний тип, то відповідно до ієрархії типів операнд більш низького типу перетворюється в операнд більш високого типу й значення виразу має той же тип 16
Ієрархія типів int < unsigned < long < unsigned long < float < double < long double 17
Зведення типів Операція зведення типів n явне перетворення даних одного типу в дані іншого типу. Синтаксис - одномісна операція, що має той же пріоритет, що й унарная операція n (Тип) Приклад n n int i; (float)i+1 рівносильно ((float)i) +1 Зведення типів є коректним, якщо воно приводить до розширення типу, і некоректним, якщо воно приводить до звуження типу (типу, більш низькому за ієрархією) 18
Ініціалізація змінних 19
Основні визначення Оголошення змінної пов'язує тип з її ім'ям Визначення змінної виділяє для неї пам'ять. Більшість оголошень є також визначеннями Ініціалізація змінної - це виділення пам'яті для неї й присвоєння початкового значення 20
Структура оголошення [специфікатор] + базовий тип + оголошена частина = [ініціалізатор]; Специфікатор n це ключове слово, що описує характеристики, не пов'язані з типом (extern й virtual) і вказує, що оголошення не є визначенням. Найтиповіші оператори оголошення: 21
Приклади char ch; int count = 1; const double pi = 3. 141592; extern int error_number; /*оголошення, але не визначення, змінна визначена в іншому файлі*/ char *name = “Njal”; char *season[ ] = {“spring”, “summer”, “autumn”, “winter”} typedef complex point; double sqrt(double); 22
Області видимості змінних При оголошенні змінних у програмі велике значення має те місце, де вони оголошені. Від того, де оголошена змінна, залежать можливість її використання. У С++ можливі три місця оголошення змінних. n n n По-перше, поза будь-яких функцій, у тому числі і main(). Така змінна називається глобальною і є видимою до кінця файлу. По-друге, змінна може бути оголошена всередині блоку, у тому числі й всередині тіла функції. Оголошена в такий спосіб змінна називається локальною і є видимою до кінця блоку. Така змінна поза блоком, у якому вона оголошена, невідома. По-третє, змінна може бути оголошена як параметр функції. Крім спеціального призначення, а саме для передачі даних у функцію, параметр можна розглядати як локальну змінну для тіла функції. 23
Приклад. Оголошення змінних. #include
Ініціалізація Ініціалізатор визначає якісний стан об'єкта. Приклад n n n int x[] = { 1, 3, 5 }; //описує й ініціалізує x як одномірний масив, що має три компонента float y[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 }}; //є повністю забезпеченою квадратними дужками ініціалізацією: значення 1, 3 та 5 ініціалізують перший ряд масиву, а саме, y[0][0], y[0][1], y[0][2] (нумерація рядків і стовпців починається з нуля). Аналогічно наступні два рядки ініціалізують другий і третій ряд масиву. Ініціалізатор закінчується раніше, тому четвертий ряд масиву ініціалізується значенням 0 (тобто y[3][0], y[3][1], y[3][2]). float y[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7}; // аналогічно попередньому виразу 25
Правило одного визначення У С++ для кожного імені повинно бути рівно одне визначення. Оголошень може бути декілька але всі вони повинні бути погоджені за типом. Правило одного визначення (ODR – one-definition rule) формулюється наступним чином: Клас, шаблон програми описується як визначення однієї й тієї ж сутності коли: n n n 1) вони перебувають у різних одиницях трансляції; 2) вони ідентичні, лексема за лексемою; 3) значення лексем однакове в одиницях трансляції. 26
Приклад 1 Файл file 1. cpp n n struct S{int a; char b; }; void f(S*); Файл file 2. cpp n n struct S{int a; char b; }; void f(S* p){/*. . . */}; Ці два оголошення припустимі, але нерозумні, тому що при супроводі file 2. cpp програміст може прийняти свою версію визначення структури S. 27
Приклад 2 Файл s. h n n struct S{int a; char b; }; // визначення структури void f(S*); // оголошення функції (прототип) Файл file 1. cpp n n #include “s. h” // виклик функції f(); Файл file 2. cpp n n #include “s. h” void f(S*p){/*. . . */}; 28
Приклад 2 (продовж. ) s. h struct S{ int a; char b ; }; void f (S*); file 1. cpp # include “s. h” int main() {. . . /*виклик функції*/. . . } file 2. cpp # include “s. h” void f(S* p) {/* тіло функції */} Порушення правила ODR може бути джерелом дуже тонких помилок. Тому потрібно створювати як можна більше самодостатніх заголовних файлів. 29
Час життя об'єкта даних Об'єкт створюється, коли зустрічається його визначення і знищується, коли його ім'я виходить із області видимості Оголошення використовуються для визначення інтерпретації, що надається кожному ідентифікатору (імені). Це означає, що потрібно задати тип ідентифікатора щоб повідомити компілятор, до якого виду об'єктів відноситься ім'я. Приклад n n n char symbol; int number = 1; double sqrt; 30
Час життя об'єкта даних Глобальні змінні створюються та ініціалізуються (тільки) один раз й "живуть" до завершення програми (час життя глобальної змінної – до кінця роботи програми). Об'єкти, визначені описом із ключовим словом static, поводяться так само. Не ініціалізована явно статична (static) змінна неявно ініціалізується нулем. Час життя локальної змінної – до виходу з блоку. 31
Приклад int a = 1; void f() { int b = 1; // ініціалізація b відбувається з //кожним викликом функції f() static int c = 1; // статична змінна створюється // тільки один раз cout << " a=" << a++ << " b=" << b++ << " c=" << c++ << " n"; } int main() { while (a < 4) f(); return 0; } Результат виконання програми : a = 1 b = 1 c = 1 a = 2 b = 1 c = 2 a = 3 b = 1 c = 3 32
Приклад int a; // помилка! Повторне оголошення extern int error_number; extern short error_number; // невідповідність типів 33