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

Post on 16-Jun-2020

3 views 0 download

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

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

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

1

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

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

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

2

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

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

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

3

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

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

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

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

4

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

5

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

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

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

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

i d signed unsigned

6

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

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

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

7

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

Розмір пам'яті, Діапазон значень для 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

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

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

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

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

9

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

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

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

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

10

ТипТип 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

операції

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

12

значення

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

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

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

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

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

13

комп'ютері

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

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

14

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

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

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

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

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

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

15

Перетворення типівПеретворення типівПеретворення типівПеретворення типівПеретворення типів від одного до іншогоПеретворення типів від одного до іншого відбувається при присвоюванні і в змішаних виразах 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

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

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

17

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

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

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

18

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

19

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

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

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

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

20

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

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

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

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

масив ][

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

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

&

21

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

)(][

ПрикладиПрикладиПрикладиПриклади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);

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

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

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

23

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

Приклад Оголошення зміннихПриклад Оголошення зміннихПриклад. Оголошення змінних. Приклад. Оголошення змінних. #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; }

ІніціалізаціяІніціалізаціяІніціалізаціяІніціалізаціяІніціалізатор визначає якісний стан об'єкта.ц рПриклад 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

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

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

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

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

26

Приклад 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.

Приклад 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){/* ...*/};

Приклад 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

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

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

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

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

30

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

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

31

блоку.

ПрикладПрикладПрикладПриклад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

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

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

extern int error_number;

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

33