Типи даних Ініціалізація...

33
Типи даних. Ініціалізація Типи даних. Ініціалізація змінних змінних змінних змінних Проф. Куссуль Н.М. 1

Transcript of Типи даних Ініціалізація...

Page 1: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Типи даних. Ініціалізація Типи даних. Ініціалізація зміннихзміннихзміннихзмінних

Проф. Куссуль Н.М.р

1

Page 2: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ВступВступВступВступ

Кожне ім'я (ідентифікатор) в C++Кожне ім я (ідентифікатор) в C++ програмі має асоційований з ним тип даних

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

2

Page 3: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Приклад Неосмислений виразПриклад Неосмислений виразПриклад. Неосмислений виразПриклад. Неосмислений вираз

Розглянемо виразРозглянемо вираз y = x + f(t)y = x + f(t)yy

Вираз буде мати сенс тоді, коли імена yy, xx, tt і функція f(t)f(t) будуть yy, , фу ц ( )( ) удуоголошені, тобто для них повинні бути визначені операції “ == ” “++” і функціявизначені операції == , ++ і функція f(t)f(t)

3

Page 4: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Типи данихТипи даних вбудовані типивбудовані типиТипи даних Типи даних –– вбудовані типивбудовані типи

Вбудовані типиВбудовані типиВбудовані типиВбудовані типи це типи, які підтримує мова ц , д р упрограмування

Вбудовані типи буваютьВбудовані типи бувають

прості (базові) та похідні, які утворюються від базових

4

Page 5: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Типи даних в С++Типи даних в С++Типи даних в С++Типи даних в С++До простих типів відносятьсяДо простих типів відносяться bool int int char float doubleДо похідних типів відносяться масиви (int a[5]) вказівники (int*a) І ій (Існує також порожній тип void (не має значення).

5

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

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

Page 6: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

МодифікаториМодифікаториМодифікаториМодифікатори

У С++ прості типи можуть бутиУ С++ прості типи можуть бути модернізовані за допомогою ключових слів: short short long

i d signed unsigned

6

Page 7: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Користувацькі типиКористувацькі типиКористувацькі типиКористувацькі типи

Крім вбудованих типів у С++ існуютьКрім вбудованих типів у С++ існують користувацькі типи, які вимагають попереднього оголошення.

Вони зазвичай складеніВони зазвичай складені структура (struct) об'єднання (union) перерахування (enum) перерахування (enum) класи (сlass)

7

Page 8: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Характеристики основних типів Характеристики основних типів даних мови С++даних мови С++даних мови С++даних мови С++

Розмір пам'яті, Діапазон значень для 16-Тип Розмір пам яті, байтів

Діапазон значень для 16розрядної архітектури

[signed] char 1 -128 127unsigned char 1 0 255[signed] short [int] 2 -32768 32767[int] unsigned short [int] 2 0 65535

[ i d] i t 32768 32767[signed] int машинне слово -32768 32767

unsigned int машинне слово 0 65535[signed] long[signed] long [int] 4 -2147483648 2147483647

[unsigned] long [int] 4 0 4294967295

8

[int]

float 4 3.4e-38 3.4e38double 8 1.7e-308 1.7e308

Page 9: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Розмір обРозмір об’’єктівєктівРозмір обРозмір об єктівєктів

Для визначення розміру об'єкту вДля визначення розміру об єкту в одиницях (найчастіше в байтах) використовується оператор sizeof:

cout << sizeof(int); cout << sizeof(int);

Діапазони всіх типів змінних ( і й і і і )(максимальні й мінімальні значення) можна одержати з заголовочного рфайлу climits ( в більш ранніх реалізаціях - limits.h)

9

реалізаціях limits.h)

Page 10: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Приклад Осмислений виразПриклад Осмислений виразПриклад. Осмислений виразПриклад. Осмислений вираз

Повертаючись до першого прикладуПовертаючись до першого прикладу, необхідно оголосити: float y; int x = 7; // ініціалізація int x = 7; // ініціалізація float f(int);

Приклад став осмисленим!

10

Page 11: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ТипТип boolboolТип Тип boolboolЛогічний тип bool має два значення:Логічний тип bool має два значення: true (1) false (0)

Ц йЦей тип використовується для представлення результатів логічних операційПрикладПриклад bool b1=a==b // якщо a=b, b1=true, інакше b1=false

bool b=7; // b=true int i=true; // i=1Тип bool можна перетворити в тип int і навпакиТип bool можна перетворити в тип int і навпакиВ арифметичних і логічних виразах логічні змінніперетворюються в цілі, і над ними виконуються

ії

11

операції

Page 12: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ТипТип сharсharТип Тип сharсharСимвольний тип сhar майже завжди займаєСимвольний тип сhar майже завжди займає 1 байт (знаковий або беззнаковий -залежить від реалізації)Кожна символьна константа має числове значення.Приклад char c = ‘a’; char c a ; cin >> c;Символьні типи є інтегральними. До них р Дможна застосувати арифметичні й логічніоперації, в них можна зберігати числові значення

12

значення

Page 13: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ТипТип intintТип Тип intint

Цілий тип int завжди є знаковимЦілий тип int завжди є знаковим int=signed int

Тип int залежить від реалізації, тому цілі літерали краще записувати в десятковій формі (8-ва й 16-ва форми можуть призвести до неявного «сюрпризу»)

Прикладi 545 int a = 545;

0хffff = 65535 // в 32-розрядному ' і

13

комп'ютері

Page 14: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Тип із плаваючою точкоюТип із плаваючою точкоюТип із плаваючою точкоюТип із плаваючою точкоюТип із плаваючою точкоюТип із плаваючою точкою float - одинарної точності double - подвійної точності long double - розширеної точності

Приклад. Літерали із плаваючою точкою: -0.457 0.457 1.23 1 23е-15 1.23е 15 1.2е10

14

Page 15: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ТипТип voidvoidТип Тип voidvoidТип void (порожній) синтаксично поводиться якТип void (порожній) синтаксично поводиться як основний тип

Однак використати його можна тільки як частинуОднак використати його можна тільки як частину похідного типу, об'єктів типу void не існує

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

Приклад void f(); //функція не повертає значення

// void * p; //вказівник на об'єкт невідомого типу

void a; //помилка

15

Page 16: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Перетворення типівПеретворення типівПеретворення типівПеретворення типівПеретворення типів від одного до іншогоПеретворення типів від одного до іншого відбувається при присвоюванні і в змішаних виразах float d=3; //дані типу int перетворюються в тип float

В і і бВ змішаних виразах відбувається два види автоматичних перетворень типів:

1) типи b l h i d h i d 1) типи bool, char, unsigned char, signed char, short перетворюються в тип int

2) якщо після першого кроку вираз має змішаний ) щ р р у ртип, то відповідно до ієрархії типів операнд більш низького типу перетворюється в операнд більш високого типу й значення виразу має той

16

б со о о у з а е разу ає оже тип

Page 17: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Ієрархія типівІєрархія типівІєрархія типівІєрархія типівint < unsigned < long < unsignedint < unsigned < long < unsigned long < float < double < long double

17

Page 18: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Зведення типівЗведення типівЗведення типівЗведення типівОперація зведення типівОперація зведення типів явне перетворення даних одного типу в дані іншого типу.Синтаксис - одномісна операція, що має той жеСинтаксис одномісна операція, що має той же пріоритет, що й унарна операція (Тип)

Приклад int i; (float)i+1 рівносильно ((float)i) +1

Зведення типів є коректним, якщо воно приводить до розширення типу і некоректним якщо вонодо розширення типу, і некоректним, якщо воно приводить до звуження типу (типу, більш низькому за ієрархією)

18

Page 19: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Ініціалізація зміннихІніціалізація зміннихІніціалізація зміннихІніціалізація змінних

19

Page 20: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ОснОсновні вовні визначенняизначенняОснОсновні вовні визначенняизначення

ОголошенняОголошення змінної пов'язує тип з їїОголошенняОголошення змінної пов язує тип з її ім'ям

ВизначенняВизначення змінної виділяє для неї пам'ять Більшість оголошень є такожпам ять. Більшість оголошень є також визначеннями

ІніціалізаціяІніціалізація змінної - це виділення пам'яті для неї та присвоєнняпам яті для неї та присвоєння початкового значення

20

Page 21: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Структура оголошенняСтруктура оголошенняСтруктура оголошенняСтруктура оголошення[специфікатор] + базовий тип +[специфікатор] + базовий тип + оголошена частина = [ініціалізатор];

Специфікатор це ключове слово, що описує характеристики, не це ключове слово, що описує характеристики, не пов'язані з типом (extern й virtual) і вказує, що оголошення не є визначенням.

Найтиповіші оператори оголошення:Найтиповіші оператори оголошення:

префіксвказівникйконстантниconstвказівник

масив ][

префікспосилання

вказівникйконстантниconst

&

21

суфіксфункціямасив

)(][

Page 22: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ПрикладиПрикладиПрикладиПрикладиchar ch;char ch;

int count = 1;

t d bl i 3 141592const double pi = 3.141592;

extern int error_number; /*оголошення, але не визначення змінна визначена вале не визначення, змінна визначена в іншому файлі*/

char *name = “Njal”;char *name = Njal ;

char *season[ ] = {“spring”, “summer”, “autumn” “winter”}autumn , winter }

typedef complex point;

d bl (d bl )

22

double sqrt(double);

Page 23: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Області видимості зміннихОбласті видимості зміннихОбласті видимості змінних Області видимості змінних При оголошенні змінних у програмі великеПри оголошенні змінних у програмі велике значення має те місце, де вони оголошені. Від того, де оголошена змінна, залежать можливості її подальшого використання.подальшого використання.У С++ можливі три місця оголошення змінних. По-перше, поза будь-яких функцій, у тому числі і main(). По перше, поза будь яких функцій, у тому числі і main(). Така змінна називається глобальною і є видимою до кінця файлу.

По-друге, змінна може бути оголошена всередині блоку, у дру , у р д у, утому числі й всередині тіла функції. Оголошена в такий спосіб змінна називається локальною і є видимою до кінця блоку. Така змінна поза блоком, у якому вона оголошена, не існуєне існує.

По-третє, змінна може бути оголошена як параметр функції. Крім спеціального призначення, а саме для передачі даних у функцію, параметр можна розглядати як

23

передачі даних у функцію, параметр можна розглядати як локальну змінну для тіла функції.

Page 24: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Приклад Оголошення зміннихПриклад Оголошення зміннихПриклад. Оголошення змінних. Приклад. Оголошення змінних. #include <iostream.h>

void sum(int ); // прототип функції

int s=0; // глобальна змінна

void main(){(){

int i, b, k; // локальні змінні

cout << "\nВведіть кількість доданків";

cin >> k;cin >> k;

for(i=0; i<k; i++)

{

t << "\ В і й "cout << "\nВведіть новий доданок ";

cin >> b;

sum(b);// виклик функції

}

cout<<"\ns="<<s;

}

24

void sum(int c)

{ s=s+c; }

Page 25: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ІніціалізаціяІніціалізаціяІніціалізаціяІніціалізаціяІніціалізатор визначає якісний стан об'єкта.ц рПриклад int x[] = { 1, 3, 5 }; //описує й ініціалізує x

як одномірний масив що має три компонентаяк одномірний масив, що має три компонента float y[4][3] =

{ { 1, 3, 5 },{ 2 4 6 }{ 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

аналогічно попередньому виразу

Page 26: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Правило одного визначенняПравило одного визначенняПравило одного визначенняПравило одного визначенняУ С++ для кожного імені повинно бути рівно однеУ С++ для кожного імені повинно бути рівно одне визначення. Оголошень може бути декілька але всі вони повинні бути погоджені за типом.

Правило одного визначення (ODR – one-definition rule) формулюється наступним чином:

Клас, шаблон програми описується як визначення однієї й тієї ж сутності коли: 1) вони перебувають у різних одиницях трансляції; 2) вони ідентичні, лексема за лексемою; 3) значення лексем однакове в одиницях трансляції. 3) значення лексем однакове в одиницях трансляції.

26

Page 27: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Приклад 1Приклад 1Приклад 1Приклад 1Файл file1 cppФайл file1.cpp struct S{int a;char b;}; void f(S*);

Файл file2.cpp struct S{int a; char b;}; void f(S* p){/* ... */}; void f(S p){/ ... /};

Ці два оголошення припустимі, але нерозумні тому що при супроводінерозумні, тому що при супроводі file2.cpp програміст може прийняти свою версію визначення структури S

27

версію визначення структури S.

Page 28: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Приклад 2Приклад 2Приклад 2Приклад 2Файл s hФайл s.h struct S{int a;char b;}; // визначення структури

void f(S*); // оголошення функції (прототип)(прототип)

Файл file1.cpp #include “s.h” // виклик функції f();

Файл file2.cpp #include “s h”

28

#include s.h void f(S*p){/* ...*/};

Page 29: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Приклад 2 (продовж )Приклад 2 (продовж )Приклад 2 (продовж.)Приклад 2 (продовж.)s.h

struct S{ int a; char b ;};void f (S*);

file2.cppfile1.cpp

# include “s.h”int main()

# include “s.h”void f(S* p) {/* і ф ії */}{... /*виклик функції*/...} {/* тіло функції */}

Порушення правила ODR може бути джерелом дуже тонких помилок. Тому потрібно створювати як можна більше

самодостатніх заголовних файлів

Порушення правила ODR може бути джерелом дуже тонких помилок. Тому потрібно створювати як можна більше

самодостатніх заголовних файлів

29

самодостатніх заголовних файлів.самодостатніх заголовних файлів.

Page 30: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Час життя об'єкта данихЧас життя об'єкта данихЧас життя об єкта данихЧас життя об єкта данихОб'єкт створюється коли зустрічається йогоОб єкт створюється, коли зустрічається його визначення і знищується, коли його ім'я виходить із області видимості

Оголошення використовуються для визначення інтерпретації, що надається кожному ідентифікатору (імені) Це означає що потрібноідентифікатору (імені). Це означає, що потрібно задати тип ідентифікатора щоб повідомити компілятор, до якого виду об'єктів відноситься ім'я. р у

Приклад char symbol;c a sy bo ; int number = 1; double sqrt;

30

Page 31: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

Час життя об'єкта данихЧас життя об'єкта данихЧас життя об єкта данихЧас життя об єкта данихГлобальні змінні створюються таГлобальні змінні створюються та ініціалізуються (тільки) один раз й "живуть" до завершення програми (час життядо завершення програми (час життя глобальної змінної – до кінця роботи програми). Об'єкти, визначені описом із ключовим словом static, поводяться так само.Не ініціалізована явно статична (static) змінна неявно ініціалізується нулем.

Час життя локальної змінної – до виходу з блоку.

31

блоку.

Page 32: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ПрикладПрикладПрикладПрикладint a = 1;

void f()

{

i t b 1 // і і і і і b і б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

a = 3 b = 1 c = 3

Page 33: Типи даних Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2011/10/Lecture2-CP… · Типи даних в С++ До простихтипів

ПрикладПрикладПрикладПрикладint a;int a;

int a; // помилка! Повторне ; // роголошення

extern int error_number;

e tern short error n mberextern short error_number; // невідповідність типів

33